Browse Source

Handle 'a::b' as MemberType (move aliases out of SimpleType).

newNRvisualizers
Daniel Grunwald 15 years ago
parent
commit
b35f1f247c
  1. 2
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/SimpleNameLookupTests.cs
  2. 9
      ICSharpCode.NRefactory/CSharp/Dom/GeneralScope/UsingDeclaration.cs
  3. 2
      ICSharpCode.NRefactory/CSharp/Dom/MemberType.cs
  4. 17
      ICSharpCode.NRefactory/CSharp/Dom/SimpleType.cs
  5. 10
      ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs
  6. 31
      ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs

2
ICSharpCode.NRefactory.Tests/CSharp/Resolver/SimpleNameLookupTests.cs

@ -190,7 +190,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -190,7 +190,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
Assert.AreSame(SharedTypes.UnknownType, result.Type);
}
[Test, Ignore("not yet implemented (depends on distuishing types and expressions)")]
[Test, Ignore("not yet implemented (depends on distuishing types and expressions in the DOM)")]
public void PropertyNameAmbiguousWithTypeName()
{
string program = @"class A {

9
ICSharpCode.NRefactory/CSharp/Dom/GeneralScope/UsingDeclaration.cs

@ -55,16 +55,15 @@ namespace ICSharpCode.NRefactory.CSharp @@ -55,16 +55,15 @@ namespace ICSharpCode.NRefactory.CSharp
MemberType m = import as MemberType;
if (m != null && !m.TypeArguments.Any()) {
AppendName(b, m.Target);
b.Append('.');
if (m.IsDoubleColon)
b.Append("::");
else
b.Append('.');
b.Append(m.Identifier);
return true;
}
SimpleType t = import as SimpleType;
if (t != null && !t.TypeArguments.Any()) {
if (t.IsQualifiedWithAlias) {
b.Append(t.AliasIdentifier.Name);
b.Append("::");
}
b.Append(t.Identifier);
return true;
}

2
ICSharpCode.NRefactory/CSharp/Dom/MemberType.cs

@ -38,6 +38,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -38,6 +38,8 @@ namespace ICSharpCode.NRefactory.CSharp
}
}
public bool IsDoubleColon { get; set; }
public DomNode Target {
get { return GetChildByRole(Roles.TargetExpression) ?? DomNode.Null; }
}

17
ICSharpCode.NRefactory/CSharp/Dom/SimpleType.cs

@ -32,29 +32,12 @@ namespace ICSharpCode.NRefactory.CSharp @@ -32,29 +32,12 @@ namespace ICSharpCode.NRefactory.CSharp
{
public class SimpleType : DomNode
{
public const int AliasRole = 100;
public override NodeType NodeType {
get {
return NodeType.Type;
}
}
/// <summary>
/// Gets whether this simple type is qualified with an alias
/// </summary>
public bool IsQualifiedWithAlias {
get {
return GetChildByRole (AliasRole) != null;
}
}
public Identifier AliasIdentifier {
get {
return (Identifier)GetChildByRole (AliasRole) ?? CSharp.Identifier.Null;
}
}
public Identifier IdentifierToken {
get {
return (Identifier)GetChildByRole (Roles.Identifier) ?? CSharp.Identifier.Null;

10
ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs

@ -123,16 +123,10 @@ namespace ICSharpCode.NRefactory.CSharp @@ -123,16 +123,10 @@ namespace ICSharpCode.NRefactory.CSharp
DomNode ConvertImport (MemberName memberName)
{
if (memberName.IsDoubleColon && memberName.Left != null) {
// left::name
SimpleType t = new SimpleType();
t.AddChild (new Identifier (memberName.Left.Name, Convert(memberName.Location)), SimpleType.AliasRole);
t.AddChild (new Identifier (memberName.Name, Convert(memberName.Location)), SimpleType.Roles.Identifier);
// TODO type arguments
return t;
} else if (memberName.Left != null) {
if (memberName.Left != null) {
// left.name
MemberType t = new MemberType();
t.IsDoubleColon = memberName.IsDoubleColon;
t.AddChild (ConvertImport (memberName.Left), MemberType.Roles.TargetExpression);
t.AddChild (new Identifier (memberName.Name, Convert(memberName.Location)), MemberType.Roles.Identifier);
return t;

31
ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs

@ -513,20 +513,15 @@ namespace ICSharpCode.NRefactory.CSharp @@ -513,20 +513,15 @@ namespace ICSharpCode.NRefactory.CSharp
foreach (var ta in s.TypeArguments) {
typeArguments.Add(ConvertType(ta, parentTypeDefinition, parentMethodDefinition, parentUsingScope, isInUsingDeclaration));
}
if (s.IsQualifiedWithAlias) {
AliasNamespaceReference ar = new AliasNamespaceReference(s.AliasIdentifier.Name, parentUsingScope);
return new MemberTypeOrNamespaceReference(ar, s.Identifier, typeArguments, parentTypeDefinition, parentUsingScope);
} else {
if (typeArguments.Count == 0 && parentMethodDefinition != null) {
// SimpleTypeOrNamespaceReference doesn't support method type parameters,
// so we directly handle them here.
foreach (ITypeParameter tp in parentMethodDefinition.TypeParameters) {
if (tp.Name == s.Identifier)
return tp;
}
if (typeArguments.Count == 0 && parentMethodDefinition != null) {
// SimpleTypeOrNamespaceReference doesn't support method type parameters,
// so we directly handle them here.
foreach (ITypeParameter tp in parentMethodDefinition.TypeParameters) {
if (tp.Name == s.Identifier)
return tp;
}
return new SimpleTypeOrNamespaceReference(s.Identifier, typeArguments, parentTypeDefinition, parentUsingScope, isInUsingDeclaration);
}
return new SimpleTypeOrNamespaceReference(s.Identifier, typeArguments, parentTypeDefinition, parentUsingScope, isInUsingDeclaration);
}
PrimitiveType p = node as PrimitiveType;
if (p != null) {
@ -567,7 +562,17 @@ namespace ICSharpCode.NRefactory.CSharp @@ -567,7 +562,17 @@ namespace ICSharpCode.NRefactory.CSharp
}
MemberType m = node as MemberType;
if (m != null) {
ITypeOrNamespaceReference t = ConvertType(m.Target, parentTypeDefinition, parentMethodDefinition, parentUsingScope, isInUsingDeclaration) as ITypeOrNamespaceReference;
ITypeOrNamespaceReference t;
if (m.IsDoubleColon) {
SimpleType st = m.Target as SimpleType;
if (st != null) {
t = new AliasNamespaceReference(st.Identifier, parentUsingScope);
} else {
t = null;
}
} else {
t = ConvertType(m.Target, parentTypeDefinition, parentMethodDefinition, parentUsingScope, isInUsingDeclaration) as ITypeOrNamespaceReference;
}
if (t == null)
return SharedTypes.UnknownType;
List<ITypeReference> typeArguments = new List<ITypeReference>();

Loading…
Cancel
Save