Browse Source

Fixed attribute completion.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2717 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
1dc3420a1b
  1. 14
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs
  2. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs
  3. 83
      src/Main/Base/Test/CSharpExpressionFinderTests.cs
  4. 45
      src/Main/Base/Test/NRefactoryResolverTests.cs
  5. 13
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs
  6. 101
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExpressionContext.cs
  7. 17
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs
  8. 19
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs

14
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ExpressionFinder.cs

@ -218,19 +218,15 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -218,19 +218,15 @@ namespace Grunwald.BooBinding.CodeCompletion
IClass c = o as IClass;
if (c != null && c.IsAbstract)
return false;
if (ExpressionContext.GetAttribute(ParserService.CurrentProjectContent).ShowEntry(o))
if (ExpressionContext.Attribute.ShowEntry(o))
return true;
if (c == null)
return false;
if (BooProject.BooCompilerPC != null) {
return c.IsTypeInInheritanceTree(BooProject.BooCompilerPC.GetClass("Boo.Lang.Compiler.AbstractAstAttribute", 0));
} else {
foreach (IReturnType baseType in c.BaseTypes) {
if (baseType.FullyQualifiedName == "Boo.Lang.Compiler.AbstractAstAttribute")
return true;
}
return false;
foreach (IClass baseType in c.ClassInheritanceTree) {
if (baseType.FullyQualifiedName == "Boo.Lang.Compiler.AbstractAstAttribute")
return true;
}
return false;
}
}
#endregion

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/MethodInsightDataProvider.cs

@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
protected virtual void SetupDataProvider(string fileName, IDocument document, ExpressionResult expressionResult, int caretLineNumber, int caretColumn)
{
bool constructorInsight = false;
if (expressionResult.Context.IsAttributeContext) {
if (expressionResult.Context == ExpressionContext.Attribute) {
constructorInsight = true;
} else if (expressionResult.Context.IsObjectCreation) {
constructorInsight = true;

83
src/Main/Base/Test/CSharpExpressionFinderTests.cs

@ -62,7 +62,7 @@ class Main { @@ -62,7 +62,7 @@ class Main {
ExpressionResult er = ef.FindFullExpression(program, pos);
Assert.AreEqual(expectedExpression, er.Expression);
if (expectedContext != null) {
Assert.AreEqual(expectedContext.ToString(), er.Context.ToString());
Assert.AreEqual(expectedContext, er.Context);
}
Assert.AreEqual(expectedExpression, ExtractRegion(program, er.Region));
}
@ -73,7 +73,7 @@ class Main { @@ -73,7 +73,7 @@ class Main {
if (pos < 0) Assert.Fail("location not found in program");
ExpressionResult er = ef.FindExpression(program, pos);
Assert.AreEqual(expectedExpression, er.Expression);
Assert.AreEqual(expectedContext.ToString(), er.Context.ToString());
Assert.AreEqual(expectedContext, er.Context);
Assert.AreEqual(expectedExpression, ExtractRegion(program, er.Region));
}
@ -322,7 +322,7 @@ class Main { @@ -322,7 +322,7 @@ class Main {
StringBuilder b = new";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectCreation, result.Context);
}
[Test]
@ -336,7 +336,7 @@ class Main { @@ -336,7 +336,7 @@ class Main {
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("StringBuilder", result.Expression);
Assert.AreEqual("StringBuilder", ExtractRegion(program, result.Region));
Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectCreation, result.Context);
}
[Test]
@ -348,7 +348,7 @@ class Main { @@ -348,7 +348,7 @@ class Main {
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("StringBuilder", result.Expression);
Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectCreation, result.Context);
}
[Test]
@ -361,7 +361,7 @@ class Main { @@ -361,7 +361,7 @@ class Main {
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("System.Text.StringBuilder", result.Expression);
Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectCreation, result.Context);
}
[Test]
@ -374,7 +374,7 @@ class Main { @@ -374,7 +374,7 @@ class Main {
ExpressionResult result = ef.FindExpression(program, program.Length - 3);
Assert.AreEqual("StringBuilder", result.Expression);
Assert.AreEqual(ExpressionContext.ObjectCreation.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectCreation, result.Context);
}
[Test]
@ -414,7 +414,7 @@ class MyList<T> where T : IComparable<T> { @@ -414,7 +414,7 @@ class MyList<T> where T : IComparable<T> {
List<T> ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("List<T> ", result.Expression);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -425,7 +425,7 @@ class MyClass { @@ -425,7 +425,7 @@ class MyClass {
List<T> field1, ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(null, result.Expression);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -436,7 +436,7 @@ class MyClass { @@ -436,7 +436,7 @@ class MyClass {
int field1 = 1, ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(null, result.Expression);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -446,7 +446,7 @@ class MyClass { @@ -446,7 +446,7 @@ class MyClass {
class MyClass {
int? ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -456,7 +456,7 @@ class MyClass { @@ -456,7 +456,7 @@ class MyClass {
class MyClass {
int[,][] ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -466,7 +466,7 @@ class MyClass { @@ -466,7 +466,7 @@ class MyClass {
class List<";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(null, result.Expression);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -476,7 +476,7 @@ class List<"; @@ -476,7 +476,7 @@ class List<";
class Dictionary<K, ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(null, result.Expression);
Assert.AreEqual(ExpressionContext.IdentifierExpected.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.IdentifierExpected, result.Context);
}
[Test]
@ -486,7 +486,7 @@ class Dictionary<K, "; @@ -486,7 +486,7 @@ class Dictionary<K, ";
class List<T> ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("List<T> ", result.Expression);
Assert.AreEqual(ExpressionContext.ConstraintsStart.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ConstraintsStart, result.Context);
}
[Test]
@ -496,7 +496,7 @@ class List<T> "; @@ -496,7 +496,7 @@ class List<T> ";
class List<T> where ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual("where ", result.Expression);
Assert.AreEqual(ExpressionContext.Constraints.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.Constraints, result.Context);
}
[Test]
@ -506,7 +506,7 @@ class List<T> where "; @@ -506,7 +506,7 @@ class List<T> where ";
class List<T> where T : ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(null, result.Expression);
Assert.AreEqual(ExpressionContext.Constraints.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.Constraints, result.Context);
}
[Test]
@ -516,7 +516,7 @@ class List<T> where T : "; @@ -516,7 +516,7 @@ class List<T> where T : ";
class List<T> where T : class, ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(null, result.Expression);
Assert.AreEqual(ExpressionContext.Constraints.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.Constraints, result.Context);
}
[Test]
@ -528,7 +528,7 @@ class Main { @@ -528,7 +528,7 @@ class Main {
a = new MyType { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -540,7 +540,7 @@ class Main { @@ -540,7 +540,7 @@ class Main {
a = new MyType<TypeArgument[], int?> { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -552,7 +552,7 @@ class Main { @@ -552,7 +552,7 @@ class Main {
a = new global::MyNamespace.MyType { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -564,7 +564,7 @@ class Main { @@ -564,7 +564,7 @@ class Main {
a = new MyType(){ ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -576,7 +576,7 @@ class Main { @@ -576,7 +576,7 @@ class Main {
a = new MyType<TypeArgument[], int?> (){ ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -588,7 +588,7 @@ class Main { @@ -588,7 +588,7 @@ class Main {
a = new MyType(arg1, ')', arg3) { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -600,7 +600,7 @@ class Main { @@ -600,7 +600,7 @@ class Main {
a = new MyType { P1 = expr, ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -612,7 +612,7 @@ class Main { @@ -612,7 +612,7 @@ class Main {
a = new MyType { P1 = ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.Default.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.Default, result.Context);
}
[Test]
@ -624,7 +624,7 @@ class Main { @@ -624,7 +624,7 @@ class Main {
a = new { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -636,7 +636,7 @@ class Main { @@ -636,7 +636,7 @@ class Main {
a = new { a.B, ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -648,7 +648,7 @@ class Main { @@ -648,7 +648,7 @@ class Main {
a = new SomeType { SomeProperty = { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -660,7 +660,7 @@ class Main { @@ -660,7 +660,7 @@ class Main {
a = new SomeType { SomeProperty = new SomeOtherType { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.ObjectInitializer.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.ObjectInitializer, result.Context);
}
[Test]
@ -672,7 +672,7 @@ class Main { @@ -672,7 +672,7 @@ class Main {
a = new [] { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.MethodBody.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.MethodBody, result.Context);
}
[Test]
@ -684,9 +684,28 @@ class Main { @@ -684,9 +684,28 @@ class Main {
a = new SomeType [] { ";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.MethodBody.ToString(), result.Context.ToString());
Assert.AreEqual(ExpressionContext.MethodBody, result.Context);
}
[Test]
public void GlobalAttribute1()
{
const string program = @"using System;
[";
ExpressionResult result = ef.FindExpression(program, program.Length);
Assert.AreEqual(ExpressionContext.Attribute, result.Context);
}
[Test]
public void GlobalAttribute2()
{
const string program = @"using System;
[TestFixture]
public class X { }";
FindFull(program, "stFix", "TestFixture", ExpressionContext.Attribute);
}
}
}

45
src/Main/Base/Test/NRefactoryResolverTests.cs

@ -114,6 +114,14 @@ namespace ICSharpCode.SharpDevelop.Tests @@ -114,6 +114,14 @@ namespace ICSharpCode.SharpDevelop.Tests
return (T)rr;
}
public T Resolve<T>(string program, string expression, int line, int column, ExpressionContext context) where T : ResolveResult
{
ResolveResult rr = Resolve(program, expression, line, column, context);
Assert.IsNotNull(rr, "Resolve returned null");
Assert.AreEqual(typeof(T), rr.GetType());
return (T)rr;
}
public T ResolveVB<T>(string program, string expression, int line) where T : ResolveResult
{
ResolveResult rr = ResolveVB(program, expression, line);
@ -1253,6 +1261,43 @@ namespace OtherName { class Bla { } } @@ -1253,6 +1261,43 @@ namespace OtherName { class Bla { } }
}
#endregion
#region Attribute tests
[Test]
public void NamespaceInAttributeContext()
{
// Classes in the current namespace are preferred over classes from
// imported namespaces
string program = @"using System;
class Test {
}
";
NamespaceResolveResult result = Resolve<NamespaceResolveResult>(program, "System", 2, 1, ExpressionContext.Attribute);
Assert.AreEqual("System", result.Name);
result = Resolve<NamespaceResolveResult>(program, "System.Runtime", 2, 1, ExpressionContext.Attribute);
Assert.AreEqual("System.Runtime", result.Name);
}
[Test]
public void AttributeWithShortName()
{
// Classes in the current namespace are preferred over classes from
// imported namespaces
string program = @"using System;
class Test {
}
";
TypeResolveResult result = Resolve<TypeResolveResult>(program, "Obsolete", 2, 1, ExpressionContext.Attribute);
Assert.AreEqual("System.ObsoleteAttribute", result.ResolvedClass.FullyQualifiedName);
result = Resolve<TypeResolveResult>(program, "System.Obsolete", 2, 1, ExpressionContext.Attribute);
Assert.AreEqual("System.ObsoleteAttribute", result.ResolvedClass.FullyQualifiedName);
}
#endregion
#region C# 3.0 tests
[Test]
public void ExtensionMethodsTest()

13
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

@ -64,6 +64,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -64,6 +64,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
Statements,
Expression,
ObjectInitializer,
AttributeSection,
AttributeArguments,
TypeParameterDecl,
Popped
}
@ -131,6 +133,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -131,6 +133,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
get {
return type == FrameType.Statements
|| type == FrameType.Expression
|| type == FrameType.AttributeArguments
|| state == FrameState.Initializer
|| state == FrameState.ObjectCreation;
}
@ -192,6 +195,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -192,6 +195,9 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
case FrameType.ObjectInitializer:
SetContext(ExpressionContext.ObjectInitializer);
break;
case FrameType.AttributeSection:
SetContext(ExpressionContext.Attribute);
break;
default:
SetContext(ExpressionContext.Default);
break;
@ -238,6 +244,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -238,6 +244,8 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
{
if (state == FrameState.Initializer || type == FrameType.ObjectInitializer) {
this.parenthesisChildType = FrameType.Expression;
} else if (type == FrameType.AttributeSection) {
this.parenthesisChildType = FrameType.AttributeArguments;
} else {
this.parenthesisChildType = this.type;
}
@ -343,6 +351,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -343,6 +351,11 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
frame.lastExpressionStart = token.Location;
frame = new Frame(frame, '(');
frame.parent.ResetParenthesisChildType();
if (token.kind == Tokens.OpenSquareBracket && !frame.parent.InExpressionMode) {
frame.type = FrameType.AttributeSection;
frame.ResetParenthesisChildType();
frame.SetDefaultContext();
}
break;
case Tokens.CloseParenthesis:
case Tokens.CloseSquareBracket:

101
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ExpressionContext.cs

@ -54,15 +54,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -54,15 +54,6 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
/// <summary>
/// Gets if the context expects an attribute.
/// </summary>
public virtual bool IsAttributeContext {
get {
return false;
}
}
public virtual bool IsTypeContext {
get { return false; }
}
@ -168,10 +159,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -168,10 +159,7 @@ namespace ICSharpCode.SharpDevelop.Dom
/// <remarks>When using this context, a resolver should try resolving typenames with an
/// appended "Attribute" suffix and treat "invocations" of the attribute type as
/// object creation.</remarks>
public static ExpressionContext GetAttribute(IProjectContent projectContent)
{
return new TypeExpressionContext(projectContent.SystemTypes.Attribute, false, true);
}
public static ExpressionContext Attribute = new AttributeExpressionContext();
/// <summary>Context expects a type name which has special base type</summary>
/// <param name="baseClass">The class the expression must derive from.</param>
@ -210,7 +198,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -210,7 +198,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public override string ToString()
{
return "[DefaultExpressionContext: " + name + "]";
return "[" + GetType().Name + ": " + name + "]";
}
}
#endregion
@ -239,9 +227,9 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -239,9 +227,9 @@ namespace ICSharpCode.SharpDevelop.Dom
public override string ToString()
{
if (allowImportClasses)
return "[ImportableExpressionContext]";
return "[" + GetType().Name + " AllowImportClasses=true]";
else
return "[NamespaceExpressionContext]";
return "[" + GetType().Name + "]";
}
}
#endregion
@ -288,12 +276,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -288,12 +276,6 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public override bool IsAttributeContext {
get {
return baseClass != null && baseClass.FullyQualifiedName == "System.Attribute";
}
}
public override bool IsTypeContext {
get { return true; }
}
@ -306,6 +288,18 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -306,6 +288,18 @@ namespace ICSharpCode.SharpDevelop.Dom
else
return "[" + GetType().Name + " IsObjectCreation=" + IsObjectCreation + "]";
}
public override bool Equals(object obj)
{
TypeExpressionContext o = obj as TypeExpressionContext;
return o != null && object.Equals(baseClass, o.baseClass) && IsObjectCreation == o.IsObjectCreation;
}
public override int GetHashCode()
{
return ((baseClass != null) ? baseClass.GetHashCode() : 0)
^ isObjectCreation.GetHashCode();
}
}
#endregion
@ -346,20 +340,40 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -346,20 +340,40 @@ namespace ICSharpCode.SharpDevelop.Dom
{
if (opType == 0)
return a.ShowEntry(o) || b.ShowEntry(o);
if (opType == 1)
else if (opType == 1)
return a.ShowEntry(o) && b.ShowEntry(o);
return a.ShowEntry(o) ^ b.ShowEntry(o);
else
return a.ShowEntry(o) ^ b.ShowEntry(o);
}
public override string ToString()
{
string op = " XOR ";
string op;
if (opType == 0)
op = " OR ";
else if (opType == 1)
op = " AND ";
else
op = " XOR ";
return "[" + GetType().Name + ": " + a + op + b + "]";
}
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
hashCode += opType.GetHashCode();
if (a != null) hashCode += a.GetHashCode() * 3;
if (b != null) hashCode += b.GetHashCode() * 181247123;
}
return hashCode;
}
public override bool Equals(object obj)
{
CombinedExpressionContext cec = obj as CombinedExpressionContext;
return cec != null && this.opType == cec.opType && object.Equals(this.a, cec.a) && object.Equals(this.b, cec.b);
}
}
#endregion
@ -371,6 +385,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -371,6 +385,7 @@ namespace ICSharpCode.SharpDevelop.Dom
IClass c = o as IClass;
if (c != null) {
// use this hack to show dummy classes like "short"
// (go from the dummy class to the real class)
if (c.Methods.Count > 0) {
c = c.Methods[0].DeclaringType;
}
@ -391,6 +406,37 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -391,6 +406,37 @@ namespace ICSharpCode.SharpDevelop.Dom
return false;
}
}
public override string ToString()
{
return "[" + GetType().Name + "]";
}
}
#endregion
#region AttributeExpressionContext
sealed class AttributeExpressionContext : ExpressionContext
{
public override bool ShowEntry(object o)
{
if (o is string)
return true;
IClass c = o as IClass;
if (c != null && !c.IsAbstract) {
return c.IsTypeInInheritanceTree(c.ProjectContent.SystemTypes.Attribute.GetUnderlyingClass());
} else {
return false;
}
}
public override bool IsTypeContext {
get { return true; }
}
public override string ToString()
{
return "[" + GetType().Name + "]";
}
}
#endregion
@ -412,6 +458,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -412,6 +458,11 @@ namespace ICSharpCode.SharpDevelop.Dom
}
return false;
}
public override string ToString()
{
return "[" + GetType().Name + "]";
}
}
#endregion

17
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

@ -225,7 +225,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -225,7 +225,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
ResolveResult rr;
if (expressionResult.Context.IsAttributeContext) {
if (expressionResult.Context == ExpressionContext.Attribute) {
return ResolveAttribute(expr, new NR.Location(caretColumn, caretLine));
} else if (expressionResult.Context == ExpressionContext.ObjectInitializer && expr is IdentifierExpression) {
bool isCollectionInitializer;
@ -355,13 +355,20 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -355,13 +355,20 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
ResolveResult ResolveAttribute(Expression expr, NR.Location position)
{
string attributeName = GetAttributeName(expr);
IClass c = GetAttribute(attributeName, position);
if (c != null) {
return new TypeResolveResult(callingClass, callingMember, c);
if (attributeName != null) {
IClass c = GetAttribute(attributeName, position);
if (c != null) {
return new TypeResolveResult(callingClass, callingMember, c);
} else {
string ns = SearchNamespace(attributeName, position);
if (ns != null) {
return new NamespaceResolveResult(callingClass, callingMember, ns);
}
}
} else if (expr is InvocationExpression) {
InvocationExpression ie = (InvocationExpression)expr;
attributeName = GetAttributeName(ie.TargetObject);
c = GetAttribute(attributeName, position);
IClass c = GetAttribute(attributeName, position);
if (c != null) {
List<IMethod> ctors = new List<IMethod>();
foreach (IMethod m in c.Methods) {

19
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs

@ -220,6 +220,23 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -220,6 +220,23 @@ namespace ICSharpCode.SharpDevelop.Dom
return contents[fileNameOrAssemblyName];
}
}
// GetProjectContentForReference supports redirecting .NET base assemblies to the correct version,
// so GetExistingProjectContent must support it, too (otherwise assembly interdependencies fail
// to resolve correctly when a .NET 1.0 assembly is used in a .NET 2.0 project)
int pos = fileNameOrAssemblyName.IndexOf(',');
if (pos > 0) {
string shortName = fileNameOrAssemblyName.Substring(0, pos);
Assembly assembly = GetDefaultAssembly(shortName);
if (assembly != null) {
lock (contents) {
if (contents.ContainsKey(assembly.FullName)) {
return contents[assembly.FullName];
}
}
}
}
return null;
}
@ -351,6 +368,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -351,6 +368,8 @@ namespace ICSharpCode.SharpDevelop.Dom
// These assemblies are already loaded by SharpDevelop, so we
// don't need to load them in a separate AppDomain/with Cecil.
switch (shortName) {
case "mscorlib":
return MscorlibAssembly;
case "System": // System != mscorlib !!!
return SystemAssembly;
case "System.Xml":

Loading…
Cancel
Save