📄 resolver.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Andrea Paatz" email="andrea@icsharpcode.net"/>
// <version value="$version"/>
// </file>
using System;
using System.Collections;
using System.Drawing;
using ICSharpCode.SharpDevelop.Services;
using SharpDevelop.Internal.Parser;
using CSharpBinding.Parser.SharpDevelopTree;
using ICSharpCode.SharpRefactory.Parser.AST;
using ICSharpCode.SharpRefactory.Parser;
namespace CSharpBinding.Parser
{
public class Resolver
{
IParserService parserService;
ICompilationUnit cu;
IClass callingClass;
LookupTableVisitor lookupTableVisitor;
public IParserService ParserService {
get {
return parserService;
}
}
public ICompilationUnit CompilationUnit {
get {
return cu;
}
}
public IClass CallingClass {
get {
return callingClass;
}
}
bool showStatic = false;
bool inNew = false;
public bool ShowStatic {
get {
return showStatic;
}
set {
showStatic = value;
}
}
int caretLine;
int caretColumn;
public ResolveResult Resolve(IParserService parserService, string expression, int caretLineNumber, int caretColumn, string fileName, string fileContent)
{
// Console.WriteLine("Start Resolving");
if (expression == null) {
return null;
}
expression = expression.TrimStart(null);
if (expression == "") {
return null;
}
if (expression.StartsWith("new ")) {
inNew = true;
expression = expression.Substring(4);
} else {
inNew = false;
}
if (expression.StartsWith("using ")) {
// expression[expression.Length - 1] != '.'
// the period that causes this Resove() is not part of the expression
if (expression[expression.Length - 1] == '.') {
return null;
}
int i;
for (i = expression.Length - 1; i >= 0; --i) {
if (!(Char.IsLetterOrDigit(expression[i]) || expression[i] == '_' || expression[i] == '.')) {
break;
}
}
// no Identifier before the period
if (i == expression.Length - 1) {
return null;
}
string t = expression.Substring(i + 1);
// Console.WriteLine("in Using Statement");
string[] namespaces = parserService.GetNamespaceList(t);
if (namespaces == null || namespaces.Length <= 0) {
return null;
}
return new ResolveResult(namespaces);
}
// Console.WriteLine("Not in Using");
this.caretLine = caretLineNumber;
this.caretColumn = caretColumn;
this.parserService = parserService;
IParseInformation parseInfo = parserService.GetParseInformation(fileName);
ICSharpCode.SharpRefactory.Parser.AST.CompilationUnit fileCompilationUnit = parseInfo.MostRecentCompilationUnit.Tag as ICSharpCode.SharpRefactory.Parser.AST.CompilationUnit;
if (fileCompilationUnit == null) {
// ICSharpCode.SharpRefactory.Parser.Parser fileParser = new ICSharpCode.SharpRefactory.Parser.Parser();
// fileParser.Parse(new Lexer(new StringReader(fileContent)));
Console.WriteLine("!Warning: no parseinformation!");
return null;
}
ICSharpCode.SharpRefactory.Parser.Parser p = new ICSharpCode.SharpRefactory.Parser.Parser();
Lexer l = new Lexer(new StringReader(expression));
Expression expr = p.ParseExpression(l);
if (expr == null) {
return null;
}
lookupTableVisitor = new LookupTableVisitor();
lookupTableVisitor.Visit(fileCompilationUnit, null);
TypeVisitor typeVisitor = new TypeVisitor(this);
CSharpVisitor cSharpVisitor = new CSharpVisitor();
cu = (ICompilationUnit)cSharpVisitor.Visit(fileCompilationUnit, null);
if (cu != null) {
callingClass = parserService.GetInnermostClass(cu, caretLine, caretColumn);
// Console.WriteLine("CallingClass is " + (callingClass == null ? "null" : callingClass.Name));
}
// Console.WriteLine("expression = " + expr.ToString());
IReturnType type = expr.AcceptVisitor(typeVisitor, null) as IReturnType;
// Console.WriteLine("type visited");
if (type == null || type.PointerNestingLevel != 0) {
// Console.WriteLine("Type == null || type.PointerNestingLevel != 0");
// if (type != null) {
// Console.WriteLine("PointerNestingLevel is " + type.PointerNestingLevel);
// } else {
// Console.WriteLine("Type == null");
// }
return null;
}
if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0) {
type = new ReturnType("System.Array");
}
// Console.WriteLine("Here: Type is " + type.FullyQualifiedName);
IClass returnClass = SearchType(type.FullyQualifiedName, callingClass, cu);
if (returnClass == null) {
// Console.WriteLine("SearchType unsuccesful!");
// Try if type is Namespace:
string n = SearchNamespace(type.FullyQualifiedName, cu);
if (n == null) {
return null;
}
ArrayList content = parserService.GetNamespaceContents(n);
ArrayList classes = new ArrayList();
for (int i = 0; i < content.Count; ++i) {
if (content[i] is IClass) {
if (inNew) {
IClass c = (IClass)content[i];
// Console.WriteLine("Testing " + c.Name);
if ((c.ClassType == ClassType.Class) || (c.ClassType == ClassType.Struct)) {
classes.Add(c);
// Console.WriteLine("Added");
}
} else {
classes.Add((IClass)content[i]);
}
}
}
string[] namespaces = parserService.GetNamespaceList(n);
return new ResolveResult(namespaces, classes);
}
// Console.WriteLine("showStatic = " + showStatic);
// Console.WriteLine("Returning Result!");
if (inNew) {
return new ResolveResult(returnClass, parserService.ListTypes(new ArrayList(), returnClass, callingClass));
} else {
return new ResolveResult(returnClass, parserService.ListMembers(new ArrayList(), returnClass, callingClass, showStatic));
}
}
bool InStatic()
{
IProperty property = GetProperty();
if (property != null) {
return property.IsStatic;
}
IMethod method = GetMethod(caretLine, caretColumn);
if (method != null) {
return method.IsStatic;
}
return false;
}
public ArrayList SearchMethod(IReturnType type, string memberName)
{
if (type == null || type.PointerNestingLevel != 0) {
return new ArrayList(1);
}
IClass curType;
if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0) {
curType = SearchType("System.Array", null, null);
} else {
curType = SearchType(type.FullyQualifiedName, null, null);
if (curType == null) {
// Console.WriteLine("Type of " + type.Name + " not found!");
return new ArrayList(1);
}
}
return SearchMethod(new ArrayList(), curType, memberName);
}
ArrayList SearchMethod(ArrayList methods, IClass curType, string memberName)
{
bool isClassInInheritanceTree = parserService.IsClassInInheritanceTree(curType, callingClass);
foreach (IMethod m in curType.Methods) {
if (m.Name == memberName &&
parserService.MustBeShown(curType, m, callingClass, showStatic, isClassInInheritanceTree) &&
!((m.Modifiers & ModifierEnum.Override) == ModifierEnum.Override)) {
methods.Add(m);
}
}
IClass baseClass = parserService.BaseClass(curType);
if (baseClass != null) {
return SearchMethod(methods, baseClass, memberName);
}
showStatic = false;
return methods;
}
public ArrayList SearchIndexer(IReturnType type)
{
IClass curType = SearchType(type.FullyQualifiedName, null, null);
if (curType != null) {
return SearchIndexer(new ArrayList(), curType);
}
return new ArrayList(1);
}
public ArrayList SearchIndexer(ArrayList indexer, IClass curType)
{
bool isClassInInheritanceTree = parserService.IsClassInInheritanceTree(curType, callingClass);
foreach (IIndexer i in curType.Indexer) {
if (parserService.MustBeShown(curType, i, callingClass, showStatic, isClassInInheritanceTree) && !((i.Modifiers & ModifierEnum.Override) == ModifierEnum.Override)) {
indexer.Add(i);
}
}
IClass baseClass = parserService.BaseClass(curType);
if (baseClass != null) {
return SearchIndexer(indexer, baseClass);
}
showStatic = false;
return indexer;
}
// no methods or indexer
public IReturnType SearchMember(IReturnType type, string memberName)
{
// TODO: use SearchMember from ParserService
if (type == null || memberName == null || memberName == "") {
return null;
}
// Console.WriteLine("searching member {0} in {1}", memberName, type.Name);
IClass curType = SearchType(type.FullyQualifiedName, callingClass, cu);
bool isClassInInheritanceTree = parserService.IsClassInInheritanceTree(curType, callingClass);
if (curType == null) {
// Console.WriteLine("Type not found in SearchMember");
return null;
}
if (type.PointerNestingLevel != 0) {
return null;
}
if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0) {
curType = SearchType("System.Array", null, null);
}
if (curType.ClassType == ClassType.Enum) {
foreach (IField f in curType.Fields) {
if (f.Name == memberName && parserService.MustBeShown(curType, f, callingClass, showStatic, isClassInInheritanceTree)) {
showStatic = false;
return type; // enum members have the type of the enum
}
}
}
if (showStatic) {
// Console.WriteLine("showStatic == true");
foreach (IClass c in curType.InnerClasses) {
if (c.Name == memberName && parserService.IsAccessible(curType, c, callingClass, isClassInInheritanceTree)) {
return new ReturnType(c.FullyQualifiedName);
}
}
}
// Console.WriteLine("#Properties " + curType.Properties.Count);
foreach (IProperty p in curType.Properties) {
// Console.WriteLine("checke Property " + p.Name);
// Console.WriteLine("member name " + memberName);
if (p.Name == memberName && parserService.MustBeShown(curType, p, callingClass, showStatic, isClassInInheritanceTree)) {
// Console.WriteLine("Property found " + p.Name);
showStatic = false;
return p.ReturnType;
}
}
foreach (IField f in curType.Fields) {
// Console.WriteLine("checke Feld " + f.Name);
// Console.WriteLine("member name " + memberName);
if (f.Name == memberName && parserService.MustBeShown(curType, f, callingClass, showStatic, isClassInInheritanceTree)) {
// Console.WriteLine("Field found " + f.Name);
showStatic = false;
return f.ReturnType;
}
}
foreach (IEvent e in curType.Events) {
if (e.Name == memberName && parserService.MustBeShown(curType, e, callingClass, showStatic, isClassInInheritanceTree)) {
showStatic = false;
return e.ReturnType;
}
}
foreach (string baseType in curType.BaseTypes) {
IClass c = SearchType(baseType, curType);
if (c != null) {
IReturnType erg = SearchMember(new ReturnType(c.FullyQualifiedName), memberName);
if (erg != null) {
return erg;
}
}
}
return null;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -