diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs
index e6b67ae927..96a2899ca0 100644
--- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs
+++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs
@@ -20,6 +20,7 @@ using System;
using System.IO;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
+using ICSharpCode.NRefactory.Utils;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.Parser
@@ -27,10 +28,13 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
[TestFixture]
public class TypeSystemConvertVisitorTests : TypeSystemTests
{
- ITypeResolveContext ctx = CecilLoaderTests.Mscorlib;
-
[TestFixtureSetUp]
public void FixtureSetUp()
+ {
+ testCasePC = ParseTestCase();
+ }
+
+ internal static IProjectContent ParseTestCase()
{
const string fileName = "TypeSystemTests.TestCase.cs";
@@ -40,10 +44,11 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
cu = parser.Parse(s);
}
- testCasePC = new SimpleProjectContent();
+ var testCasePC = new SimpleProjectContent();
ParsedFile parsedFile = new TypeSystemConvertVisitor(testCasePC, fileName).Convert(cu);
parsedFile.Freeze();
testCasePC.UpdateProjectContent(null, parsedFile);
+ return testCasePC;
}
}
}
diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
index 5b247cae60..614f24eb7e 100644
--- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
+++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
@@ -148,6 +148,7 @@
+
diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/CecilLoaderTests.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/CecilLoaderTests.cs
index c9dc2859c3..0a3746f585 100644
--- a/ICSharpCode.NRefactory.Tests/TypeSystem/CecilLoaderTests.cs
+++ b/ICSharpCode.NRefactory.Tests/TypeSystem/CecilLoaderTests.cs
@@ -78,7 +78,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
IProperty def = c.Properties.Single(p => p.Name == "Default");
ParameterizedType pt = (ParameterizedType)def.ReturnType.Resolve(ctx);
Assert.AreEqual("System.Collections.Generic.Comparer", pt.FullName);
- Assert.AreSame(c.TypeParameters[0], pt.TypeArguments[0]);
+ Assert.AreEqual(c.TypeParameters[0], pt.TypeArguments[0]);
}
[Test]
diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/SerializedCecilLoaderTests.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/SerializedCecilLoaderTests.cs
new file mode 100644
index 0000000000..9bbafb8516
--- /dev/null
+++ b/ICSharpCode.NRefactory.Tests/TypeSystem/SerializedCecilLoaderTests.cs
@@ -0,0 +1,42 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.IO;
+using ICSharpCode.NRefactory.Utils;
+using NUnit.Framework;
+
+namespace ICSharpCode.NRefactory.TypeSystem
+{
+ [TestFixture]
+ public class SerializedCecilLoaderTests : TypeSystemTests
+ {
+ [TestFixtureSetUp]
+ public void FixtureSetUp()
+ {
+ CecilLoader loader = new CecilLoader() { IncludeInternalMembers = true };
+ IProjectContent pc = loader.LoadAssemblyFile(typeof(TestCase.SimplePublicClass).Assembly.Location);
+ FastSerializer serializer = new FastSerializer();
+ using (MemoryStream ms = new MemoryStream()) {
+ serializer.Serialize(ms, pc);
+ ms.Position = 0;
+ testCasePC = (IProjectContent)serializer.Deserialize(ms);
+ }
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
index b65aa16a9c..8146213d65 100644
--- a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
+++ b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
@@ -84,7 +84,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
public void DynamicType()
{
ITypeDefinition testClass = testCasePC.GetTypeDefinition(typeof(DynamicTest));
- Assert.AreSame(SharedTypes.Dynamic, testClass.Properties.Single().ReturnType.Resolve(ctx));
+ Assert.AreEqual(SharedTypes.Dynamic, testClass.Properties.Single().ReturnType.Resolve(ctx));
Assert.AreEqual(0, testClass.Properties.Single().Attributes.Count);
}
diff --git a/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs b/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs
index bef0dffd81..ef5fc7cac3 100644
--- a/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs
+++ b/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs
@@ -33,6 +33,7 @@ namespace ICSharpCode.NRefactory.Documentation
/// This class first creates an in-memory index of the .xml file, and then uses that to read only the requested members.
/// This way, we avoid keeping all the documentation in memory.
///
+ [Serializable]
public class XmlDocumentationProvider : IDocumentationProvider
{
#region Cache
@@ -66,6 +67,7 @@ namespace ICSharpCode.NRefactory.Documentation
}
#endregion
+ [Serializable]
struct IndexEntry : IComparable
{
///
@@ -90,7 +92,9 @@ namespace ICSharpCode.NRefactory.Documentation
}
}
+ [NonSerialized]
readonly XmlDocumentationCache cache = new XmlDocumentationCache();
+
readonly string fileName;
DateTime lastWriteDate;
IndexEntry[] index; // SORTED array of index entries
@@ -265,6 +269,8 @@ namespace ICSharpCode.NRefactory.Documentation
#endregion
#region Save index / Restore from index
+ // TODO: consider removing this code, we're just using serialization instead
+
// FILE FORMAT FOR BINARY DOCUMENTATION
// long magic = 0x4244636f446c6d58 (identifies file type = 'XmlDocDB')
const long magic = 0x4244636f446c6d58;
diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
index a50b047eb4..0f57ac2975 100644
--- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
+++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
@@ -336,6 +336,7 @@
+
@@ -343,6 +344,7 @@
+
diff --git a/ICSharpCode.NRefactory/TypeSystem/ArrayType.cs b/ICSharpCode.NRefactory/TypeSystem/ArrayType.cs
index 86dc6884ad..c5a8fb5a8a 100644
--- a/ICSharpCode.NRefactory/TypeSystem/ArrayType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/ArrayType.cs
@@ -25,6 +25,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
///
/// Represents an array type.
///
+ [Serializable]
public sealed class ArrayType : TypeWithElementType
{
readonly int dimensions;
@@ -135,6 +136,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
}
}
+ [Serializable]
public sealed class ArrayTypeReference : ITypeReference, ISupportsInterning
{
ITypeReference elementType;
diff --git a/ICSharpCode.NRefactory/TypeSystem/ByReferenceType.cs b/ICSharpCode.NRefactory/TypeSystem/ByReferenceType.cs
index 8ae58c6e7c..553341f2f3 100644
--- a/ICSharpCode.NRefactory/TypeSystem/ByReferenceType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/ByReferenceType.cs
@@ -21,6 +21,7 @@ using ICSharpCode.NRefactory.TypeSystem.Implementation;
namespace ICSharpCode.NRefactory.TypeSystem
{
+ [Serializable]
public sealed class ByReferenceType : TypeWithElementType
{
public ByReferenceType(IType elementType) : base(elementType)
@@ -68,6 +69,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
}
}
+ [Serializable]
public class ByReferenceTypeReference : ITypeReference
{
readonly ITypeReference elementType;
diff --git a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
index 02fbb9fa67..0bdb727d61 100644
--- a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
@@ -84,6 +84,9 @@ namespace ICSharpCode.NRefactory.TypeSystem
{
if (createCecilReferences)
typeSystemTranslationTable = new Dictionary
+ [Serializable]
public abstract class Immutable : IFreezable
{
bool IFreezable.IsFrozen {
@@ -38,6 +39,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
+ [Serializable]
public abstract class AbstractFreezable : IFreezable
{
bool isFrozen;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractMember.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractMember.cs
index 31521b5ce7..e581c1ec2b 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractMember.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractMember.cs
@@ -25,6 +25,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Base class for implementations.
///
+ [Serializable]
public abstract class AbstractMember : AbstractFreezable, IMember
{
// possible optimizations to reduce the memory usage of AbstractMember:
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractType.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractType.cs
index bc2a300b2b..d070a81471 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractType.cs
@@ -26,6 +26,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation for IType interface.
///
+ [Serializable]
public abstract class AbstractType : IType
{
public virtual string FullName {
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAccessor.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAccessor.cs
index 98df4ba2f8..3be4ba66d5 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAccessor.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAccessor.cs
@@ -25,6 +25,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of .
///
+ [Serializable]
public sealed class DefaultAccessor : AbstractFreezable, IAccessor, ISupportsInterning
{
static readonly DefaultAccessor[] defaultAccessors = CreateDefaultAccessors();
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAttribute.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAttribute.cs
index f14bc057a6..152146d52e 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAttribute.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultAttribute.cs
@@ -27,6 +27,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of .
///
+ [Serializable]
public sealed class DefaultAttribute : AbstractFreezable, IAttribute, ISupportsInterning
{
ITypeReference attributeType;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs
index 6f065d0030..bea77a960f 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs
@@ -23,6 +23,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of .
///
+ [Serializable]
public class DefaultEvent : AbstractMember, IEvent
{
IAccessor addAccessor, removeAccessor, invokeAccessor;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultField.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultField.cs
index 2293e7f6a7..22c33d980d 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultField.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultField.cs
@@ -23,6 +23,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of .
///
+ [Serializable]
public class DefaultField : AbstractMember, IField
{
IConstantValue constantValue;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMethod.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMethod.cs
index daa3047ff6..203cd31ff2 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMethod.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMethod.cs
@@ -25,6 +25,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of interface.
///
+ [Serializable]
public class DefaultMethod : AbstractMember, IMethod
{
IList returnTypeAttributes;
@@ -123,7 +124,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
var p = this.Parameters;
for (int i = 0; i < p.Count; i++) {
if (i > 0) b.Append(", ");
- b.Append(p[i].ToString());
+ if (p[i] == null)
+ b.Append("null");
+ else
+ b.Append(p[i].ToString());
}
b.Append("):");
b.Append(ReturnType.ToString());
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs
index a9823bc5e6..fc035938fe 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs
@@ -26,6 +26,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation for IParameter.
///
+ [Serializable]
public sealed class DefaultParameter : AbstractFreezable, IParameter, ISupportsInterning
{
string name = string.Empty;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultProperty.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultProperty.cs
index 6a2ddf4949..8e3ec666fb 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultProperty.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultProperty.cs
@@ -24,6 +24,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of .
///
+ [Serializable]
public class DefaultProperty : AbstractMember, IProperty
{
IAccessor getter, setter;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeDefinition.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeDefinition.cs
index f9c3eaa086..34d4b3d79a 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeDefinition.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeDefinition.cs
@@ -25,6 +25,7 @@ using ICSharpCode.NRefactory.Utils;
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
+ [Serializable]
public class DefaultTypeDefinition : AbstractFreezable, ITypeDefinition
{
readonly IProjectContent projectContent;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeParameter.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeParameter.cs
index ca234e5bd1..656e1348ce 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeParameter.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultTypeParameter.cs
@@ -27,6 +27,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Default implementation of .
///
+ [Serializable]
public sealed class DefaultTypeParameter : AbstractFreezable, ITypeParameter, ISupportsInterning
{
string name;
@@ -348,8 +349,13 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
void ISupportsInterning.PrepareForInterning(IInterningProvider provider)
{
- constraints = provider.InternList(constraints);
- attributes = provider.InternList(attributes);
+ // protect against cyclic constraints
+ using (var busyLock = BusyManager.Enter(this)) {
+ if (busyLock.Success) {
+ constraints = provider.InternList(constraints);
+ attributes = provider.InternList(attributes);
+ }
+ }
}
int ISupportsInterning.GetHashCodeForInterning()
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs
index 83a5cb45d0..c0df2456bd 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs
@@ -25,11 +25,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Type Reference used when the fully qualified type name is known.
///
+ [Serializable]
public sealed class GetClassTypeReference : ITypeReference, ISupportsInterning
{
string nameSpace, name;
int typeParameterCount;
- //volatile CachedResult v_cachedResult;
+ // [NonSerialized] volatile CachedResult v_cachedResult;
public GetClassTypeReference(string nameSpace, string name, int typeParameterCount)
{
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs
index 11f8749454..04e9385a21 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs
@@ -23,6 +23,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Type reference used to reference nested types.
///
+ [Serializable]
public sealed class NestedTypeReference : ITypeReference, ISupportsInterning
{
ITypeReference declaringTypeRef;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/ProxyTypeResolveContext.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/ProxyTypeResolveContext.cs
index 43f1f9fe56..898c98077b 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/ProxyTypeResolveContext.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/ProxyTypeResolveContext.cs
@@ -25,6 +25,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
/// Proxy that forwards calls to another TypeResolveContext.
/// Useful as base class for decorators.
///
+ [Serializable]
public class ProxyTypeResolveContext : AbstractAnnotatable, ITypeResolveContext
{
protected readonly ITypeResolveContext target;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleConstantValue.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleConstantValue.cs
index 9cba2a5ecc..b378430374 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleConstantValue.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleConstantValue.cs
@@ -23,6 +23,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// A simple constant value that is independent of the resolve context.
///
+ [Serializable]
public sealed class SimpleConstantValue : Immutable, IConstantValue, ISupportsInterning
{
ITypeReference type;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleInterningProvider.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleInterningProvider.cs
index ca7ef2f7dc..58009843df 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleInterningProvider.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/SimpleInterningProvider.cs
@@ -104,6 +104,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
Dictionary supportsInternDict = new Dictionary(new InterningComparer());
Dictionary listDict = new Dictionary(new ListComparer());
+ int stackDepth = 0;
+
public T Intern(T obj) where T : class
{
if (obj == null)
@@ -127,6 +129,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
else
byValueDict.Add(obj, obj);
}
+ stackDepth--;
return obj;
}
@@ -138,8 +141,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
T oldItem = list[i];
T newItem = Intern(oldItem);
if (oldItem != newItem) {
- if (list.IsReadOnly)
- list = new T[list.Count];
+ if (list.IsReadOnly) {
+ T[] array = new T[list.Count];
+ list.CopyTo(array, 0);
+ list = array;
+ }
list[i] = newItem;
}
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeStorage.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeStorage.cs
index 407390cf55..53eb718cef 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeStorage.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeStorage.cs
@@ -19,8 +19,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Runtime.Serialization;
using System.Threading;
-
using ICSharpCode.NRefactory.Utils;
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
@@ -31,7 +31,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Concurrent read accesses are thread-safe, but a write access concurrent to any other access is not safe.
///
- public sealed class TypeStorage : ITypeResolveContext
+ [Serializable]
+ public sealed class TypeStorage : ITypeResolveContext, ISerializable, IDeserializationCallback
{
#region FullNameAndTypeParameterCount
struct FullNameAndTypeParameterCount
@@ -362,5 +363,35 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
#endregion
+
+ #region Serialization
+ ///
+ /// Creates a new TypeStorage instance.
+ ///
+ public TypeStorage()
+ {
+ }
+
+ SerializationInfo serializationInfo;
+
+ protected TypeStorage(SerializationInfo info, StreamingContext context)
+ {
+ this.serializationInfo = info;
+ }
+
+ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ info.AddValue("Types", this.GetTypes().ToArray());
+ }
+
+ void IDeserializationCallback.OnDeserialization(object sender)
+ {
+ if (serializationInfo == null)
+ return;
+ foreach (var typeDef in (ITypeDefinition[])serializationInfo.GetValue("Types", typeof(ITypeDefinition[]))) {
+ UpdateType(typeDef);
+ }
+ }
+ #endregion
}
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeWithElementType.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeWithElementType.cs
index 1f86861879..482fcc8acd 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeWithElementType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeWithElementType.cs
@@ -20,6 +20,7 @@ using System;
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
+ [Serializable]
public abstract class TypeWithElementType : AbstractType
{
protected readonly IType elementType;
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/VoidTypeDefinition.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/VoidTypeDefinition.cs
index e8ec0a12c3..c8b2d8832f 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/VoidTypeDefinition.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/VoidTypeDefinition.cs
@@ -24,6 +24,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
///
/// Special type definition for 'void'.
///
+ [Serializable]
public class VoidTypeDefinition : DefaultTypeDefinition
{
public VoidTypeDefinition(IProjectContent projectContent)
diff --git a/ICSharpCode.NRefactory/TypeSystem/IntersectionType.cs b/ICSharpCode.NRefactory/TypeSystem/IntersectionType.cs
index 3e0251845a..2e5bf8849a 100644
--- a/ICSharpCode.NRefactory/TypeSystem/IntersectionType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/IntersectionType.cs
@@ -30,6 +30,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
///
/// Represents the intersection of several types.
///
+ [Serializable]
public class IntersectionType : AbstractType
{
readonly ReadOnlyCollection types;
diff --git a/ICSharpCode.NRefactory/TypeSystem/ParameterizedType.cs b/ICSharpCode.NRefactory/TypeSystem/ParameterizedType.cs
index 9cd4f872e8..862abbc3fb 100644
--- a/ICSharpCode.NRefactory/TypeSystem/ParameterizedType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/ParameterizedType.cs
@@ -36,6 +36,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// type parameters in the signatures of the members are replaced with
/// the type arguments.
///
+ [Serializable]
public sealed class ParameterizedType : Immutable, IType
{
readonly ITypeDefinition genericType;
@@ -327,6 +328,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// ParameterizedTypeReference is a reference to generic class that specifies the type parameters.
/// Example: List<string>
///
+ [Serializable]
public sealed class ParameterizedTypeReference : ITypeReference, ISupportsInterning
{
public static ITypeReference Create(ITypeReference genericType, IEnumerable typeArguments)
diff --git a/ICSharpCode.NRefactory/TypeSystem/PointerType.cs b/ICSharpCode.NRefactory/TypeSystem/PointerType.cs
index 2b2a54d6d7..07dc29c1a2 100644
--- a/ICSharpCode.NRefactory/TypeSystem/PointerType.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/PointerType.cs
@@ -22,6 +22,7 @@ using ICSharpCode.NRefactory.TypeSystem.Implementation;
namespace ICSharpCode.NRefactory.TypeSystem
{
+ [Serializable]
public sealed class PointerType : TypeWithElementType
{
public PointerType(IType elementType) : base(elementType)
@@ -69,6 +70,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
}
}
+ [Serializable]
public class PointerTypeReference : ITypeReference
{
readonly ITypeReference elementType;
diff --git a/ICSharpCode.NRefactory/TypeSystem/SharedTypes.cs b/ICSharpCode.NRefactory/TypeSystem/SharedTypes.cs
index 62bb562adf..6fc19ae88f 100644
--- a/ICSharpCode.NRefactory/TypeSystem/SharedTypes.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/SharedTypes.cs
@@ -70,6 +70,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
* would have to return true even though these are two distinct definitions.
*/
+ [Serializable]
sealed class SharedTypeImpl : AbstractType
{
readonly TypeKind kind;
diff --git a/ICSharpCode.NRefactory/Utils/7BitEncodedInts.cs b/ICSharpCode.NRefactory/Utils/7BitEncodedInts.cs
new file mode 100644
index 0000000000..b16047c95c
--- /dev/null
+++ b/ICSharpCode.NRefactory/Utils/7BitEncodedInts.cs
@@ -0,0 +1,117 @@
+// Copyright (c) 2011 Daniel Grunwald
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.IO;
+
+namespace ICSharpCode.NRefactory.Utils
+{
+ ///
+ /// A binary reader that can read the output of BinaryWriterWith7BitEncodedInts.
+ ///
+ public sealed class BinaryReaderWith7BitEncodedInts : BinaryReader
+ {
+ public BinaryReaderWith7BitEncodedInts(Stream stream) : base(stream)
+ {
+ }
+
+ public override short ReadInt16()
+ {
+ return unchecked((short)(ushort)base.Read7BitEncodedInt());
+ }
+
+ public override ushort ReadUInt16()
+ {
+ return unchecked((ushort)base.Read7BitEncodedInt());
+ }
+
+ public override int ReadInt32()
+ {
+ return base.Read7BitEncodedInt();
+ }
+
+ public override uint ReadUInt32()
+ {
+ return unchecked((uint)base.Read7BitEncodedInt());
+ }
+
+ public override long ReadInt64()
+ {
+ return unchecked((long)this.ReadUInt64());
+ }
+
+ public override ulong ReadUInt64()
+ {
+ ulong num = 0;
+ int shift = 0;
+ while (shift < 64) {
+ byte b = this.ReadByte();
+ num |= (ulong)(b & 127) << shift;
+ shift += 7;
+ if ((b & 128) == 0) {
+ return num;
+ }
+ }
+ throw new FormatException("Invalid 7-bit int64");
+ }
+ }
+
+ ///
+ /// A binary writer that encodes all integers as 7-bit-encoded-ints.
+ ///
+ public sealed class BinaryWriterWith7BitEncodedInts : BinaryWriter
+ {
+ public BinaryWriterWith7BitEncodedInts(Stream stream) : base(stream)
+ {
+ }
+
+ public override void Write(short value)
+ {
+ base.Write7BitEncodedInt(unchecked((ushort)value));
+ }
+
+ public override void Write(ushort value)
+ {
+ base.Write7BitEncodedInt(value);
+ }
+
+ public override void Write(int value)
+ {
+ base.Write7BitEncodedInt(value);
+ }
+
+ public override void Write(uint value)
+ {
+ base.Write7BitEncodedInt(unchecked((int)value));
+ }
+
+ public override void Write(long value)
+ {
+ this.Write(unchecked((ulong)value));
+ }
+
+ public override void Write(ulong value)
+ {
+ while (value >= 128) {
+ this.Write(unchecked((byte)(value | 128u)));
+ value >>= 7;
+ }
+ this.Write(unchecked((byte)value));
+ }
+ }
+}
diff --git a/ICSharpCode.NRefactory/Utils/BitVector16.cs b/ICSharpCode.NRefactory/Utils/BitVector16.cs
index b5ab44bee8..a8b5122159 100644
--- a/ICSharpCode.NRefactory/Utils/BitVector16.cs
+++ b/ICSharpCode.NRefactory/Utils/BitVector16.cs
@@ -23,6 +23,7 @@ namespace ICSharpCode.NRefactory.Utils
///
/// Holds 16 boolean values.
///
+ [Serializable]
public struct BitVector16 : IEquatable
{
ushort data;
diff --git a/ICSharpCode.NRefactory/Utils/EmptyList.cs b/ICSharpCode.NRefactory/Utils/EmptyList.cs
index 4022223a83..f39e6f2916 100644
--- a/ICSharpCode.NRefactory/Utils/EmptyList.cs
+++ b/ICSharpCode.NRefactory/Utils/EmptyList.cs
@@ -23,6 +23,7 @@ using System.Collections.ObjectModel;
namespace ICSharpCode.NRefactory
{
+ [Serializable]
sealed class EmptyList : IList, IEnumerator
{
public static readonly IList Instance = new EmptyList();
diff --git a/ICSharpCode.NRefactory/Utils/FastSerializer.cs b/ICSharpCode.NRefactory/Utils/FastSerializer.cs
new file mode 100644
index 0000000000..a823c2db1a
--- /dev/null
+++ b/ICSharpCode.NRefactory/Utils/FastSerializer.cs
@@ -0,0 +1,1148 @@
+// Copyright (c) 2011 Daniel Grunwald
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
+using System.Runtime.Serialization;
+
+namespace ICSharpCode.NRefactory.Utils
+{
+ public class FastSerializer
+ {
+ #region Serialization
+ sealed class ReferenceComparer : IEqualityComparer