From b57806f09612805e9e8a02ee548153b97fcf074c Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 25 Jul 2013 22:58:18 +0200 Subject: [PATCH] Fix crash in resolver when trying to resolve the warning-id PrimitiveExpression within PreprocessorWarningDirective. --- ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs | 7 +++++-- ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs index 0809f3233..09c92bcd9 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs @@ -464,9 +464,12 @@ CSharpResolver GetPreviouslyScannedContext(AstNode node, out AstNode parent) parent = node; CSharpResolver storedResolver; while (!resolverBeforeDict.TryGetValue(parent, out storedResolver)) { - parent = parent.Parent; - if (parent == null) + AstNode tmp = parent.Parent; + if (tmp == null) throw new InvalidOperationException("Could not find a resolver state for any parent of the specified node. Are you trying to resolve a node that is not a descendant of the CSharpAstResolver's root node?"); + if (tmp.NodeType == NodeType.Whitespace) + return resolver; // special case: resolve expression within preprocessor directive + parent = tmp; } return storedResolver; } diff --git a/ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs b/ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs index 19fe6a36b..1c6f16c61 100644 --- a/ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs +++ b/ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs @@ -92,7 +92,9 @@ public virtual void Validate(CSharpAstResolver resolver, SyntaxTree syntaxTree) { foreach (AstNode node in syntaxTree.DescendantsAndSelf.Except(resolvedNodes.Keys)) { if (!CSharpAstResolver.IsUnresolvableNode(node)) { - Console.WriteLine("Forgot to resolve " + node); + if (!node.Ancestors.Any(a => a is PreProcessorDirective)) { + Console.WriteLine("Forgot to resolve " + node); + } } } foreach (var pair in resolvedNodes) {