Browse Source

Fixed forum-7077 (Boo code completion)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1357 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
06f093be9a
  1. 17
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs
  2. 20
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs
  3. 30
      src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs
  4. 7
      src/Main/Base/Project/Src/Dom/ResolveResult.cs

17
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs

@ -286,18 +286,18 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -286,18 +286,18 @@ namespace Grunwald.BooBinding.CodeCompletion
public ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent, ExpressionContext context)
{
ArrayList result;
ArrayList result = new ArrayList();
if (!Initialize(fileName, caretLine, caretColumn))
return null;
if (context == ExpressionContext.Importable) {
result = new ArrayList();
pc.AddNamespaceContents(result, "", pc.Language, true);
NRResolver.AddUsing(result, pc.DefaultImports, pc);
return result;
}
result = GetImportedNamespaceContents();
NRResolver.AddContentsFromCalling(result, callingClass, callingMember);
AddImportedNamespaceContents(result);
if (BooProject.BooCompilerPC != null) {
if (context == ExpressionFinder.BooAttributeContext.Instance) {
@ -317,8 +317,6 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -317,8 +317,6 @@ namespace Grunwald.BooBinding.CodeCompletion
}
}
NRResolver.AddContentsFromCalling(result, callingClass, callingMember);
List<string> knownVariableNames = new List<string>();
foreach (object o in result) {
IMember m = o as IMember;
@ -338,14 +336,19 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -338,14 +336,19 @@ namespace Grunwald.BooBinding.CodeCompletion
// used by ctrl+space and resolve visitor (resolve identifier)
public ArrayList GetImportedNamespaceContents()
{
ArrayList list = new ArrayList();
ArrayList result = new ArrayList();
AddImportedNamespaceContents(result);
return result;
}
void AddImportedNamespaceContents(ArrayList list)
{
IClass c;
foreach (KeyValuePair<string, string> pair in BooAmbience.TypeConversionTable) {
c = GetPrimitiveClass(pc, pair.Key, pair.Value);
if (c != null) list.Add(c);
}
NRResolver.AddImportedNamespaceContents(list, cu, callingClass);
return list;
}
#endregion
}

20
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs

@ -361,19 +361,28 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -361,19 +361,28 @@ namespace Grunwald.BooBinding.CodeCompletion
{
ClearResult();
node.Target.Accept(this);
if (resolveResult is MixedResolveResult) {
MixedResolveResult mixed = (MixedResolveResult)resolveResult;
resolveResult = mixed.TypeResult;
foreach (ResolveResult rr in mixed.Results) {
if (rr is MethodResolveResult) {
resolveResult = rr;
break;
}
}
}
if (resolveResult == null)
return;
if (resolveResult is MethodResolveResult) {
// normal method call
string methodName = ((MethodResolveResult)resolveResult).Name;
IReturnType containingType = ((MethodResolveResult)resolveResult).ContainingType;
ResolveMethodInType(containingType, methodName, node.Arguments);
} else if (resolveResult is TypeResolveResult || resolveResult is MixedResolveResult) {
TypeResolveResult trr = resolveResult as TypeResolveResult;
if (trr == null)
trr = (resolveResult as MixedResolveResult).TypeResult;
if (trr != null && trr.ResolvedClass != null) {
} else if (resolveResult is TypeResolveResult) {
TypeResolveResult trr = (TypeResolveResult)resolveResult;
if (trr.ResolvedClass != null) {
if (trr.ResolvedClass.FullyQualifiedName == "array") {
ResolveArrayCreation(node.Arguments);
return;
@ -535,6 +544,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -535,6 +544,7 @@ namespace Grunwald.BooBinding.CodeCompletion
switch (node.Operator) {
case BinaryOperatorType.GreaterThan:
case BinaryOperatorType.GreaterThanOrEqual:
case BinaryOperatorType.Equality:
case BinaryOperatorType.Inequality:
case BinaryOperatorType.LessThan:
case BinaryOperatorType.LessThanOrEqual:

30
src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs

@ -182,6 +182,36 @@ namespace Grunwald.BooBinding.Tests @@ -182,6 +182,36 @@ namespace Grunwald.BooBinding.Tests
LocalResolveResult rr = Resolve<LocalResolveResult>("myObject", "/*inRecursiveClosure*/");
Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void EqualityOperator()
{
ResolveResult rr = Resolve<ResolveResult>("0 == 0");
Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName);
rr = Resolve<ResolveResult>("0 != 1");
Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName);
rr = Resolve<ResolveResult>("null is null");
Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName);
rr = Resolve<ResolveResult>("object() is not null");
Assert.AreEqual("System.Boolean", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void ClassMethodAmbiguity()
{
string prog =
"class Test:\n" +
"\tdef constructor():\n" +
"\t\tpass\n" +
"class OtherClass:\n" +
"\tdef Test():\n" +
"\t\t/*mark*/\n" +
"\t\tpass\n";
ResolveResult rr = Resolve(prog, new ExpressionResult("Test()"), "/*mark*/");
Assert.IsNotNull(rr);
Assert.IsInstanceOfType(typeof(MemberResolveResult), rr);
Assert.AreEqual("OtherClass.Test", (rr as MemberResolveResult).ResolvedMember.FullyQualifiedName);
}
#endregion
#region Regression

7
src/Main/Base/Project/Src/Dom/ResolveResult.cs

@ -214,6 +214,13 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -214,6 +214,13 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public IEnumerable<ResolveResult> Results {
get {
yield return primaryResult;
yield return secondaryResult;
}
}
public TypeResolveResult TypeResult {
get {
if (primaryResult is TypeResolveResult)

Loading…
Cancel
Save