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
Assert.AreSame(SharedTypes.UnknownType, result.Type); 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() public void PropertyNameAmbiguousWithTypeName()
{ {
string program = @"class A { string program = @"class A {

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

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

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

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

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

@ -32,29 +32,12 @@ namespace ICSharpCode.NRefactory.CSharp
{ {
public class SimpleType : DomNode public class SimpleType : DomNode
{ {
public const int AliasRole = 100;
public override NodeType NodeType { public override NodeType NodeType {
get { get {
return NodeType.Type; 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 { public Identifier IdentifierToken {
get { get {
return (Identifier)GetChildByRole (Roles.Identifier) ?? CSharp.Identifier.Null; return (Identifier)GetChildByRole (Roles.Identifier) ?? CSharp.Identifier.Null;

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

@ -123,16 +123,10 @@ namespace ICSharpCode.NRefactory.CSharp
DomNode ConvertImport (MemberName memberName) DomNode ConvertImport (MemberName memberName)
{ {
if (memberName.IsDoubleColon && memberName.Left != null) { if (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) {
// left.name // left.name
MemberType t = new MemberType(); MemberType t = new MemberType();
t.IsDoubleColon = memberName.IsDoubleColon;
t.AddChild (ConvertImport (memberName.Left), MemberType.Roles.TargetExpression); t.AddChild (ConvertImport (memberName.Left), MemberType.Roles.TargetExpression);
t.AddChild (new Identifier (memberName.Name, Convert(memberName.Location)), MemberType.Roles.Identifier); t.AddChild (new Identifier (memberName.Name, Convert(memberName.Location)), MemberType.Roles.Identifier);
return t; return t;

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

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

Loading…
Cancel
Save