Browse Source

Name resolution fix: prefer using aliases over imported types.

pull/14/head
Daniel Grunwald 15 years ago
parent
commit
9359f9af74
  1. 45
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs

45
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs

@ -815,7 +815,7 @@ namespace ICSharpCode.SharpDevelop.Dom
return GetNamespaces(language).ContainsKey(name); return GetNamespaces(language).ContainsKey(name);
} }
bool MatchesRequest(ref SearchTypeRequest request, ref SearchTypeResult result) bool MatchesRequest(SearchTypeRequest request, ref SearchTypeResult result)
{ {
if (result.NamespaceResult != null) if (result.NamespaceResult != null)
return request.TypeParameterCount == 0; return request.TypeParameterCount == 0;
@ -852,7 +852,7 @@ namespace ICSharpCode.SharpDevelop.Dom
foreach (IClass innerClass in baseClass.InnerClasses) { foreach (IClass innerClass in baseClass.InnerClasses) {
if (language.NameComparer.Equals(innerClass.Name, name)) { if (language.NameComparer.Equals(innerClass.Name, name)) {
result = new SearchTypeResult(innerClass); result = new SearchTypeResult(innerClass);
if (MatchesRequest(ref request, ref result)) { if (MatchesRequest(request, ref result)) {
return result; return result;
} }
} }
@ -873,50 +873,55 @@ namespace ICSharpCode.SharpDevelop.Dom
IClass c = GetClass(fullname, request.TypeParameterCount); IClass c = GetClass(fullname, request.TypeParameterCount);
if (c != null) { if (c != null) {
result = new SearchTypeResult(c); result = new SearchTypeResult(c);
if (MatchesRequest(ref request, ref result)) { if (MatchesRequest(request, ref result)) {
return result; return result;
} }
} }
if (NamespaceExists(fullname)) { if (NamespaceExists(fullname)) {
result = new SearchTypeResult(fullname, null); result = new SearchTypeResult(fullname, null);
if (MatchesRequest(ref request, ref result)) { if (MatchesRequest(request, ref result)) {
return result; return result;
} }
} }
// prefer aliases over imported types
foreach (IUsing u in usingScope.Usings) { foreach (IUsing u in usingScope.Usings) {
foreach (IReturnType r in u.SearchType(name, request.TypeParameterCount)) { if (u.HasAliases) {
result = new SearchTypeResult(r, u); if (SearchTypeInUsing(u, request, ref result))
if (MatchesRequest(ref request, ref result)) {
return result; return result;
} }
} }
string nsResult = u.SearchNamespace(name); foreach (IUsing u in usingScope.Usings) {
if (nsResult != null) { if (!u.HasAliases) {
result = new SearchTypeResult(nsResult, null); if (SearchTypeInUsing(u, request, ref result))
if (MatchesRequest(ref request, ref result)) {
return result; return result;
} }
} }
} }
}
if (defaultImports != null) { if (defaultImports != null) {
foreach (IReturnType r in defaultImports.SearchType(name, request.TypeParameterCount)) { if (SearchTypeInUsing(defaultImports, request, ref result));
result = new SearchTypeResult(r, defaultImports);
if (MatchesRequest(ref request, ref result)) {
return result; return result;
} }
return result;
} }
string nsResult = defaultImports.SearchNamespace(name);
bool SearchTypeInUsing(IUsing u, SearchTypeRequest request, ref SearchTypeResult result)
{
foreach (IReturnType r in u.SearchType(request.Name, request.TypeParameterCount)) {
result = new SearchTypeResult(r, u);
if (MatchesRequest(request, ref result)) {
return true;
}
}
string nsResult = u.SearchNamespace(request.Name);
if (nsResult != null) { if (nsResult != null) {
result = new SearchTypeResult(nsResult, null); result = new SearchTypeResult(nsResult, null);
if (MatchesRequest(ref request, ref result)) { if (MatchesRequest(request, ref result)) {
return result; return true;
}
} }
} }
return result; return false;
} }
/// <summary> /// <summary>

Loading…
Cancel
Save