📄 nrefactoryresolver.cs
字号:
public string SearchNamespace(string name)
{
return projectContent.SearchNamespace(name, callingClass, cu, caretLine, caretColumn);
}
public IClass GetClass(string fullName)
{
return projectContent.GetClass(fullName);
}
/// <remarks>
/// use the usings and the name of the namespace to find a class
/// </remarks>
public IClass SearchClass(string name)
{
IReturnType t = SearchType(name);
return (t != null) ? t.GetUnderlyingClass() : null;
}
public IReturnType SearchType(string name)
{
return projectContent.SearchType(name, 0, callingClass, cu, caretLine, caretColumn);
}
#region Helper for TypeVisitor
#region SearchMethod
public List<IMethod> SearchMethod(string memberName)
{
List<IMethod> methods = SearchMethod(callingClass.DefaultReturnType, memberName);
if (methods.Count > 0)
return methods;
if (languageProperties.CanImportClasses) {
foreach (IUsing @using in cu.Usings) {
foreach (string import in @using.Usings) {
IClass c = projectContent.GetClass(import, 0);
if (c != null) {
methods = SearchMethod(c.DefaultReturnType, memberName);
if (methods.Count > 0)
return methods;
}
}
}
}
if (languageProperties.ImportModules) {
ArrayList list = new ArrayList();
AddImportedNamespaceContents(list, cu, callingClass);
foreach (object o in list) {
IMethod m = o as IMethod;
if (m != null && IsSameName(m.Name, memberName)) {
methods.Add(m);
}
}
}
return methods;
}
/// <summary>
/// Gets the list of methods on the return type that have the specified name.
/// </summary>
public List<IMethod> SearchMethod(IReturnType type, string memberName)
{
List<IMethod> methods = new List<IMethod>();
if (type == null)
return methods;
bool isClassInInheritanceTree = false;
if (callingClass != null)
isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(type.GetUnderlyingClass());
foreach (IMethod m in type.GetMethods()) {
if (IsSameName(m.Name, memberName)
&& m.IsAccessible(callingClass, isClassInInheritanceTree)
) {
methods.Add(m);
}
}
if (methods.Count == 0) {
if (languageProperties.SupportsExtensionMethods && callingClass != null) {
ArrayList list = new ArrayList();
ResolveResult.AddExtensions(languageProperties, list, callingClass, type);
foreach (IMethodOrProperty mp in list) {
if (mp is IMethod && IsSameName(mp.Name, memberName)) {
methods.Add((IMethod)mp);
}
}
}
}
return methods;
}
#endregion
#region SearchMember
// no methods or indexer
public IReturnType SearchMember(IReturnType type, string memberName)
{
if (type == null)
return null;
IMember member = GetMember(type, memberName);
if (member == null)
return null;
else
return member.ReturnType;
}
public IMember GetMember(IReturnType type, string memberName)
{
if (type == null)
return null;
bool isClassInInheritanceTree = false;
if (callingClass != null)
isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(type.GetUnderlyingClass());
foreach (IProperty p in type.GetProperties()) {
if (IsSameName(p.Name, memberName)) {
return p;
}
}
foreach (IField f in type.GetFields()) {
if (IsSameName(f.Name, memberName)) {
return f;
}
}
foreach (IEvent e in type.GetEvents()) {
if (IsSameName(e.Name, memberName)) {
return e;
}
}
return null;
}
#endregion
#region DynamicLookup
/// <remarks>
/// does the dynamic lookup for the identifier
/// </remarks>
public IReturnType DynamicLookup(string identifier)
{
ResolveResult rr = ResolveIdentifierInternal(identifier);
if (rr is NamespaceResolveResult) {
return new TypeVisitor.NamespaceReturnType((rr as NamespaceResolveResult).Name);
}
return (rr != null) ? rr.ResolvedType : null;
}
IParameter SearchMethodParameter(string parameter)
{
IMethodOrProperty method = callingMember as IMethodOrProperty;
if (method == null) {
return null;
}
foreach (IParameter p in method.Parameters) {
if (IsSameName(p.Name, parameter)) {
return p;
}
}
return null;
}
IReturnType GetVariableType(LocalLookupVariable v)
{
if (v == null) {
return null;
}
return TypeVisitor.CreateReturnType(v.TypeRef, this);
}
LocalLookupVariable SearchVariable(string name)
{
if (!lookupTableVisitor.Variables.ContainsKey(name))
return null;
List<LocalLookupVariable> variables = lookupTableVisitor.Variables[name];
if (variables.Count <= 0) {
return null;
}
foreach (LocalLookupVariable v in variables) {
if (IsInside(new Point(caretColumn, caretLine), v.StartPos, v.EndPos)) {
return v;
}
}
return null;
}
#endregion
#endregion
IClass GetPrimitiveClass(string systemType, string newName)
{
IClass c = ProjectContentRegistry.Mscorlib.GetClass(systemType);
DefaultClass c2 = new DefaultClass(c.CompilationUnit, newName);
c2.ClassType = c.ClassType;
c2.Modifiers = c.Modifiers;
c2.Documentation = c.Documentation;
c2.BaseTypes.AddRange(c.BaseTypes);
c2.Methods.AddRange(c.Methods);
c2.Fields.AddRange(c.Fields);
c2.Properties.AddRange(c.Properties);
c2.Events.AddRange(c.Events);
return c2;
}
public ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent, ExpressionContext context)
{
ArrayList result = new ArrayList();
if (language == SupportedLanguage.VBNet) {
foreach (KeyValuePair<string, string> pair in TypeReference.GetPrimitiveTypesVB()) {
string primitive = Char.ToUpper(pair.Key[0]) + pair.Key.Substring(1);
if ("System." + primitive != pair.Value) {
result.Add(GetPrimitiveClass(pair.Value, primitive));
}
}
result.Add("Global");
result.Add("New");
} else {
foreach (KeyValuePair<string, string> pair in TypeReference.GetPrimitiveTypesCSharp()) {
result.Add(GetPrimitiveClass(pair.Value, pair.Key));
}
}
ParseInformation parseInfo = ParserService.GetParseInformation(fileName);
if (parseInfo == null) {
return null;
}
this.caretLine = caretLine;
this.caretColumn = caretColumn;
lookupTableVisitor = new LookupTableVisitor(languageProperties.NameComparer);
cu = parseInfo.MostRecentCompilationUnit;
if (cu != null) {
callingClass = cu.GetInnermostClass(caretLine, caretColumn);
}
callingMember = GetCurrentMember();
if (callingMember != null) {
System.IO.TextReader content = ExtractMethod(fileContent, callingMember);
if (content != null) {
ICSharpCode.NRefactory.Parser.IParser p = ParserFactory.CreateParser(language, content);
p.Parse();
lookupTableVisitor.Visit(p.CompilationUnit, null);
}
}
AddContentsFromCalling(result, callingClass, callingMember);
foreach (KeyValuePair<string, List<LocalLookupVariable>> pair in lookupTableVisitor.Variables) {
if (pair.Value != null && pair.Value.Count > 0) {
foreach (LocalLookupVariable v in pair.Value) {
if (IsInside(new Point(caretColumn, caretLine), v.StartPos, v.EndPos)) {
// convert to a field for display
result.Add(CreateLocalVariableField(v, pair.Key));
break;
}
}
}
}
AddImportedNamespaceContents(result, cu, callingClass);
return result;
}
public static void AddContentsFromCalling(ArrayList result, IClass callingClass, IMember callingMember)
{
IMethodOrProperty methodOrProperty = callingMember as IMethodOrProperty;
if (methodOrProperty != null) {
foreach (IParameter p in methodOrProperty.Parameters) {
result.Add(new DefaultField.ParameterField(p.ReturnType, p.Name, methodOrProperty.Region, callingClass));
}
}
bool inStatic = false;
if (callingMember != null)
inStatic = callingMember.IsStatic;
if (callingClass != null) {
ArrayList members = new ArrayList();
IReturnType t = callingClass.DefaultReturnType;
members.AddRange(t.GetMethods());
members.AddRange(t.GetFields());
members.AddRange(t.GetEvents());
members.AddRange(t.GetProperties());
foreach (IMember m in members) {
if ((!inStatic || m.IsStatic) && m.IsAccessible(callingClass, true)) {
result.Add(m);
}
}
members.Clear();
IClass c = callingClass.DeclaringType;
while (c != null) {
t = c.DefaultReturnType;
members.AddRange(t.GetMethods());
members.AddRange(t.GetFields());
members.AddRange(t.GetEvents());
members.AddRange(t.GetProperties());
c = c.DeclaringType;
}
foreach (IMember m in members) {
if (m.IsStatic) {
result.Add(m);
}
}
}
}
public static void AddImportedNamespaceContents(ArrayList result, ICompilationUnit cu, IClass callingClass)
{
IProjectContent projectContent = cu.ProjectContent;
projectContent.AddNamespaceContents(result, "", projectContent.Language, true);
foreach (IUsing u in cu.Usings) {
AddUsing(result, u, projectContent);
}
AddUsing(result, projectContent.DefaultImports, projectContent);
if (callingClass != null) {
string[] namespaceParts = callingClass.Namespace.Split('.');
for (int i = 1; i <= namespaceParts.Length; i++) {
foreach (object member in projectContent.GetNamespaceContents(string.Join(".", namespaceParts, 0, i))) {
if (!result.Contains(member))
result.Add(member);
}
}
IClass currentClass = callingClass;
do {
foreach (IClass innerClass in currentClass.GetAccessibleTypes(currentClass)) {
if (!result.Contains(innerClass))
result.Add(innerClass);
}
currentClass = currentClass.DeclaringType;
} while (currentClass != null);
}
}
public static void AddUsing(ArrayList result, IUsing u, IProjectContent projectContent)
{
if (u == null) {
return;
}
bool importNamespaces = projectContent.Language.ImportNamespaces;
bool importClasses = projectContent.Language.CanImportClasses;
foreach (string name in u.Usings) {
if (importClasses) {
IClass c = projectContent.GetClass(name, 0);
if (c != null) {
ArrayList members = new ArrayList();
IReturnType t = c.DefaultReturnType;
members.AddRange(t.GetMethods());
members.AddRange(t.GetFields());
members.AddRange(t.GetEvents());
members.AddRange(t.GetProperties());
foreach (IMember m in members) {
if (m.IsStatic && m.IsPublic) {
result.Add(m);
}
}
continue;
}
}
if (importNamespaces) {
string newName = null;
if (projectContent.DefaultImports != null) {
newName = projectContent.DefaultImports.SearchNamespace(name);
}
projectContent.AddNamespaceContents(result, newName ?? name, projectContent.Language, true);
} else {
foreach (object o in projectContent.GetNamespaceContents(name)) {
if (!(o is string))
result.Add(o);
}
}
}
if (u.HasAliases) {
foreach (string alias in u.Aliases.Keys) {
result.Add(alias);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -