From 24e7b56613a6b9558508eb8d47520331cbaef079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Thu, 4 Oct 2012 14:34:59 +0200 Subject: [PATCH] Fixed cyclic constants. --- .../Resolver/CSharpConversions.cs | 5 +++- .../Parser/TypeSystemConvertVisitorTests.cs | 1 + .../Implementation/DefaultResolvedField.cs | 23 +++++++++++-------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs b/ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs index aa96853535..7b0f0f364d 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs @@ -651,7 +651,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver long val = (long)rr.ConstantValue; return val >= 0 && toTypeCode == TypeCode.UInt64; } else if (fromTypeCode == TypeCode.Int32) { - int val = (int)rr.ConstantValue; + object cv = rr.ConstantValue; + if (cv == null) + return false; + int val = (int)cv; switch (toTypeCode) { case TypeCode.SByte: return val >= SByte.MinValue && val <= SByte.MaxValue; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs index 19d7e5608b..8657662f5c 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs @@ -97,6 +97,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser Assert.NotNull (testType); var field = testType.Fields.First (); Assert.IsTrue (field.IsConst); + Assert.IsNull (field.ConstantValue); } } diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs index ba26e24cb8..ffa72549f5 100644 --- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs +++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; using ICSharpCode.NRefactory.Semantics; +using ICSharpCode.NRefactory.Utils; namespace ICSharpCode.NRefactory.TypeSystem.Implementation { @@ -49,16 +50,20 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation public object ConstantValue { get { - ResolveResult rr = this.constantValue; - if (rr == null) { - IConstantValue unresolvedCV = ((IUnresolvedField)unresolved).ConstantValue; - if (unresolvedCV != null) - rr = unresolvedCV.Resolve(context); - else - rr = ErrorResolveResult.UnknownError; - this.constantValue = rr; + using (var busyLock = BusyManager.Enter(this)) { + if (!busyLock.Success) + return null; + ResolveResult rr = this.constantValue; + if (rr == null) { + IConstantValue unresolvedCV = ((IUnresolvedField)unresolved).ConstantValue; + if (unresolvedCV != null) + rr = unresolvedCV.Resolve(context); + else + rr = ErrorResolveResult.UnknownError; + this.constantValue = rr; + } + return rr.ConstantValue; } - return rr.ConstantValue; } } }