Browse Source

Fixed resolver bugs that caused unit test errors.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
e926745da6
  1. 47
      ICSharpCode.NRefactory/CSharp/Ast/CSharpModifierToken.cs
  2. 2
      ICSharpCode.NRefactory/CSharp/Ast/Modifiers.cs
  3. 9
      ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs
  4. 22
      ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs

47
ICSharpCode.NRefactory/CSharp/Ast/CSharpModifierToken.cs

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
//
// CSharpModifierToken.cs
//
//
// Author:
// Mike Krüger <mkrueger@novell.com>
//
@ -37,14 +37,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -37,14 +37,8 @@ namespace ICSharpCode.NRefactory.CSharp
public Modifiers Modifier {
get { return modifier; }
set {
for (int i = 0; i < lengthTable.Count; i++) {
if (lengthTable[i].Key == value) {
this.modifier = value;
this.tokenLength = lengthTable[i].Value;
return;
}
}
throw new ArgumentException ("Modifier " + value + " is invalid.");
this.tokenLength = GetModifierName(value).Length;
this.modifier = value;
}
}
@ -56,30 +50,18 @@ namespace ICSharpCode.NRefactory.CSharp @@ -56,30 +50,18 @@ namespace ICSharpCode.NRefactory.CSharp
// Not worth using a dictionary for such few elements.
// This table is sorted in the order that modifiers should be output when generating code.
static readonly List<KeyValuePair<Modifiers, int>> lengthTable = new List<KeyValuePair<Modifiers, int>> () {
new KeyValuePair<Modifiers, int>(Modifiers.Public, "public".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Protected, "protected".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Private, "private".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Internal, "internal".Length),
new KeyValuePair<Modifiers, int>(Modifiers.New, "new".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Unsafe, "unsafe".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Abstract, "abstract".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Virtual, "virtual".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Sealed, "sealed".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Static, "static".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Override, "override".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Readonly, "readonly".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Volatile, "volatile".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Extern, "extern".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Partial, "partial".Length),
new KeyValuePair<Modifiers, int>(Modifiers.Const, "const".Length),
// even though it's used for patterns only, it needs to be in this table to be usable in the AST
new KeyValuePair<Modifiers, int>(Modifiers.Any, "any".Length)
static readonly Modifiers[] allModifiers = {
Modifiers.Public, Modifiers.Protected, Modifiers.Private, Modifiers.Internal,
Modifiers.New,
Modifiers.Unsafe,
Modifiers.Abstract, Modifiers.Virtual, Modifiers.Sealed, Modifiers.Static, Modifiers.Override,
Modifiers.Readonly, Modifiers.Volatile,
Modifiers.Extern, Modifiers.Partial, Modifiers.Const,
Modifiers.Any
};
public static IEnumerable<Modifiers> AllModifiers {
get { return lengthTable.Select(p => p.Key); }
get { return allModifiers; }
}
public CSharpModifierToken (AstLocation location, Modifiers modifier) : base (location, 0)
@ -122,8 +104,9 @@ namespace ICSharpCode.NRefactory.CSharp @@ -122,8 +104,9 @@ namespace ICSharpCode.NRefactory.CSharp
return "volatile";
case Modifiers.Unsafe:
return "unsafe";
case Modifiers.Fixed:
return "fixed";
case Modifiers.Any:
// even though it's used for patterns only, it needs to be in this list to be usable in the AST
return "any";
default:
throw new NotSupportedException("Invalid value for Modifiers");
}

2
ICSharpCode.NRefactory/CSharp/Ast/Modifiers.cs

@ -58,7 +58,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -58,7 +58,7 @@ namespace ICSharpCode.NRefactory.CSharp
//Overloads = 0x10000,
//WithEvents = 0x20000,
//Default = 0x40000,
Fixed = 0x80000,
//Fixed = 0x80000,
//ProtectedOrInternal = Internal | Protected,
//ProtectedAndInternal = 0x100000, (not supported in C#)

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

@ -340,9 +340,6 @@ namespace ICSharpCode.NRefactory.CSharp @@ -340,9 +340,6 @@ namespace ICSharpCode.NRefactory.CSharp
field.IsReadOnly = (modifiers & Modifiers.Readonly) != 0;
field.ReturnType = ConvertType(fieldDeclaration.ReturnType);
if ((modifiers & Modifiers.Fixed) != 0) {
field.ReturnType = PointerTypeReference.Create(field.ReturnType);
}
if ((modifiers & Modifiers.Const) != 0) {
field.ConstantValue = ConvertConstantValue(field.ReturnType, vi.Initializer);
@ -356,6 +353,12 @@ namespace ICSharpCode.NRefactory.CSharp @@ -356,6 +353,12 @@ namespace ICSharpCode.NRefactory.CSharp
return isSingleField ? field : null;
}
public override IEntity VisitFixedFieldDeclaration(FixedFieldDeclaration fixedFieldDeclaration, object data)
{
// TODO: add support for fixed fields
return base.VisitFixedFieldDeclaration(fixedFieldDeclaration, data);
}
public override IEntity VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDeclaration, object data)
{
DefaultField field = new DefaultField(currentTypeDefinition, enumMemberDeclaration.Name);

22
ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs

@ -374,14 +374,23 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -374,14 +374,23 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (resolveResultCache.TryGetValue(node, out result))
return result;
bool needResolveParent = (node.NodeType == NodeType.Token || IsVar(node));
AstNode nodeToResolve = node;
if (needResolveParent) {
nodeToResolve = node.Parent;
if (resolveResultCache.ContainsKey(nodeToResolve))
return null;
}
AstNode parent;
CSharpResolver storedResolver = GetPreviouslyScannedContext(node, out parent);
CSharpResolver storedResolver = GetPreviouslyScannedContext(nodeToResolve, out parent);
ResetContext(
storedResolver.Clone(),
delegate {
navigator = new NodeListResolveVisitorNavigator(node);
if (parent == node) {
Resolve(node);
navigator = new NodeListResolveVisitorNavigator(nodeToResolve);
if (parent == nodeToResolve) {
Resolve(nodeToResolve);
} else {
Debug.Assert(!resolverEnabled);
parent.AcceptVisitor(this, null);
@ -2343,6 +2352,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -2343,6 +2352,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ITypeReference type;
if (needResolve) {
type = Resolve(vi.Initializer).Type;
if (!resolveResultCache.ContainsKey(variableDeclarationStatement.Type)) {
StoreResult(variableDeclarationStatement.Type, new TypeResolveResult(type.Resolve(resolver.Context)));
}
} else {
Scan(vi.Initializer);
type = MakeVarTypeReference(vi.Initializer, false);
@ -2528,7 +2540,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -2528,7 +2540,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
#endregion
#region Local Variable Type Inference
static bool IsVar(AstType returnType)
static bool IsVar(AstNode returnType)
{
SimpleType st = returnType as SimpleType;
return st != null && st.Identifier == "var" && st.TypeArguments.Count == 0;

Loading…
Cancel
Save