diff --git a/ILSpy/Cecil/CecilExtensions.cs b/ILSpy/Cecil/CecilExtensions.cs deleted file mode 100644 index c14568f2d..000000000 --- a/ILSpy/Cecil/CecilExtensions.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2011 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.Collections.Generic; -using System.Linq; -using ICSharpCode.Decompiler.TypeSystem; -using Mono.Cecil; -using Mono.Cecil.Cil; -using ArrayType = Mono.Cecil.ArrayType; - -namespace ICSharpCode.ILSpy.Cecil -{ - /// - /// Cecil helper methods. - /// - public static class CecilExtensions - { - public static HashSet GetAccessorMethods(this TypeDefinition type) - { - HashSet accessorMethods = new HashSet(); - foreach (var property in type.Properties) { - accessorMethods.Add(property.GetMethod); - accessorMethods.Add(property.SetMethod); - if (property.HasOtherMethods) { - foreach (var m in property.OtherMethods) - accessorMethods.Add(m); - } - } - foreach (EventDefinition ev in type.Events) { - accessorMethods.Add(ev.AddMethod); - accessorMethods.Add(ev.RemoveMethod); - accessorMethods.Add(ev.InvokeMethod); - if (ev.HasOtherMethods) { - foreach (var m in ev.OtherMethods) - accessorMethods.Add(m); - } - } - return accessorMethods; - } - - public static TypeDefinition ResolveWithinSameModule(this TypeReference type) - { - if (type != null && type.GetElementType().Module == type.Module) - return type.Resolve(); - else - return null; - } - } -} \ No newline at end of file diff --git a/ILSpy/Cecil/TypesHierarchyHelpers.cs b/ILSpy/Cecil/TypesHierarchyHelpers.cs deleted file mode 100644 index 6c60a86b4..000000000 --- a/ILSpy/Cecil/TypesHierarchyHelpers.cs +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright (c) 2011 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.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using Mono.Cecil; - -namespace ICSharpCode.ILSpy.Cecil -{ - public static class TypesHierarchyHelpers - { - public static bool IsBaseType(TypeDefinition baseType, TypeDefinition derivedType, bool resolveTypeArguments) - { - if (resolveTypeArguments) - return BaseTypes(derivedType).Any(t => t.Item == baseType); - else { - var comparableBaseType = baseType.Resolve(); - if (comparableBaseType == null) - return false; - while (derivedType.BaseType != null) { - var resolvedBaseType = derivedType.BaseType.Resolve(); - if (resolvedBaseType == null) - return false; - if (comparableBaseType == resolvedBaseType) - return true; - derivedType = resolvedBaseType; - } - return false; - } - } - - /// - /// Determines whether one method overrides or hides another method. - /// - /// The method declared in a base type. - /// The method declared in a derived type. - /// true if hides or overrides , - /// otherwise false. - public static bool IsBaseMethod(MethodDefinition parentMethod, MethodDefinition childMethod) - { - if (parentMethod == null) - throw new ArgumentNullException(nameof(parentMethod)); - if (childMethod == null) - throw new ArgumentNullException(nameof(childMethod)); - - if (parentMethod.Name != childMethod.Name) - return false; - - if (parentMethod.HasParameters || childMethod.HasParameters) - if (!parentMethod.HasParameters || !childMethod.HasParameters || parentMethod.Parameters.Count != childMethod.Parameters.Count) - return false; - - return FindBaseMethods(childMethod).Any(m => m == parentMethod);// || (parentMethod.HasGenericParameters && m.); - } - - /// - /// Determines whether a property overrides or hides another property. - /// - /// The property declared in a base type. - /// The property declared in a derived type. - /// true if the hides or overrides , - /// otherwise false. - public static bool IsBaseProperty(PropertyDefinition parentProperty, PropertyDefinition childProperty) - { - if (parentProperty == null) - throw new ArgumentNullException(nameof(parentProperty)); - if (childProperty == null) - throw new ArgumentNullException(nameof(childProperty)); - - if (parentProperty.Name != childProperty.Name) - return false; - - if (parentProperty.HasParameters || childProperty.HasParameters) - if (!parentProperty.HasParameters || !childProperty.HasParameters || parentProperty.Parameters.Count != childProperty.Parameters.Count) - return false; - - return FindBaseProperties(childProperty).Any(m => m == parentProperty); - } - - public static bool IsBaseEvent(EventDefinition parentEvent, EventDefinition childEvent) - { - if (parentEvent.Name != childEvent.Name) - return false; - - return FindBaseEvents(childEvent).Any(m => m == parentEvent); - } - - /// - /// Finds all methods from base types overridden or hidden by the specified method. - /// - /// The method which overrides or hides methods from base types. - /// Methods overriden or hidden by the specified method. - public static IEnumerable FindBaseMethods(MethodDefinition method) - { - if (method == null) - throw new ArgumentNullException(nameof(method)); - - var typeContext = CreateGenericContext(method.DeclaringType); - var gMethod = typeContext.ApplyTo(method); - - foreach (var baseType in BaseTypes(method.DeclaringType)) - foreach (var baseMethod in baseType.Item.Methods) - if (MatchMethod(baseType.ApplyTo(baseMethod), gMethod) && IsVisibleFromDerived(baseMethod, method.DeclaringType)) { - yield return baseMethod; - if (baseMethod.IsNewSlot == baseMethod.IsVirtual) - yield break; - } - } - - /// - /// Finds all properties from base types overridden or hidden by the specified property. - /// - /// The property which overrides or hides properties from base types. - /// Properties overriden or hidden by the specified property. - public static IEnumerable FindBaseProperties(PropertyDefinition property) - { - if (property == null) - throw new ArgumentNullException(nameof(property)); - - if ((property.GetMethod ?? property.SetMethod).HasOverrides) - yield break; - - var typeContext = CreateGenericContext(property.DeclaringType); - var gProperty = typeContext.ApplyTo(property); - bool isIndexer = property.IsIndexer(); - - foreach (var baseType in BaseTypes(property.DeclaringType)) - foreach (var baseProperty in baseType.Item.Properties) - if (MatchProperty(baseType.ApplyTo(baseProperty), gProperty) - && IsVisibleFromDerived(baseProperty, property.DeclaringType)) { - if (isIndexer != baseProperty.IsIndexer()) - continue; - yield return baseProperty; - var anyPropertyAccessor = baseProperty.GetMethod ?? baseProperty.SetMethod; - if (anyPropertyAccessor.IsNewSlot == anyPropertyAccessor.IsVirtual) - yield break; - } - } - - public static IEnumerable FindBaseEvents(EventDefinition eventDef) - { - if (eventDef == null) - throw new ArgumentNullException(nameof(eventDef)); - - var typeContext = CreateGenericContext(eventDef.DeclaringType); - var gEvent = typeContext.ApplyTo(eventDef); - - foreach (var baseType in BaseTypes(eventDef.DeclaringType)) - foreach (var baseEvent in baseType.Item.Events) - if (MatchEvent(baseType.ApplyTo(baseEvent), gEvent) && IsVisibleFromDerived(baseEvent, eventDef.DeclaringType)) { - yield return baseEvent; - var anyEventAccessor = baseEvent.AddMethod ?? baseEvent.RemoveMethod; - if (anyEventAccessor.IsNewSlot == anyEventAccessor.IsVirtual) - yield break; - } - - } - - /// - /// Determinates whether member of the base type is visible from a derived type. - /// - /// The member which visibility is checked. - /// The derived type. - /// true if the member is visible from derived type, othewise false. - public static bool IsVisibleFromDerived(IMemberDefinition baseMember, TypeDefinition derivedType) - { - if (baseMember == null) - throw new ArgumentNullException(nameof(baseMember)); - if (derivedType == null) - throw new ArgumentNullException(nameof(derivedType)); - - MethodAttributes attrs = GetAccessAttributes(baseMember) & MethodAttributes.MemberAccessMask; - if (attrs == MethodAttributes.Private) - return false; - - if (baseMember.DeclaringType.Module == derivedType.Module) - return true; - - if (attrs == MethodAttributes.Assembly || attrs == MethodAttributes.FamANDAssem) { - var derivedTypeAsm = derivedType.Module.Assembly; - var asm = baseMember.DeclaringType.Module.Assembly; - - if (asm.HasCustomAttributes) { - var attributes = asm.CustomAttributes - .Where(attr => attr.AttributeType.FullName == "System.Runtime.CompilerServices.InternalsVisibleToAttribute"); - foreach (var attribute in attributes) { - string assemblyName = attribute.ConstructorArguments[0].Value as string; - assemblyName = assemblyName.Split(',')[0]; // strip off any public key info - if (assemblyName == derivedTypeAsm.Name.Name) - return true; - } - } - - return false; - } - - return true; - } - - private static MethodAttributes GetAccessAttributes(IMemberDefinition member) - { - var fld = member as FieldDefinition; - if (fld != null) - return (MethodAttributes)fld.Attributes; - - var method = member as MethodDefinition; - if (method != null) - return method.Attributes; - - var prop = member as PropertyDefinition; - if (prop != null) { - return (prop.GetMethod ?? prop.SetMethod).Attributes; - } - - var evnt = member as EventDefinition; - if (evnt != null) { - return (evnt.AddMethod ?? evnt.RemoveMethod).Attributes; - } - - var nestedType = member as TypeDefinition; - if (nestedType != null) { - if (nestedType.IsNestedPrivate) - return MethodAttributes.Private; - if (nestedType.IsNestedAssembly || nestedType.IsNestedFamilyAndAssembly) - return MethodAttributes.Assembly; - return MethodAttributes.Public; - } - - throw new NotSupportedException(); - } - - private static bool MatchMethod(GenericContext candidate, GenericContext method) - { - var mCandidate = candidate.Item; - var mMethod = method.Item; - if (mCandidate.Name != mMethod.Name) - return false; - - if (mCandidate.HasOverrides) - return false; - - if (mCandidate.IsSpecialName != method.Item.IsSpecialName) - return false; - - if (mCandidate.HasGenericParameters || mMethod.HasGenericParameters) { - if (!mCandidate.HasGenericParameters || !mMethod.HasGenericParameters || mCandidate.GenericParameters.Count != mMethod.GenericParameters.Count) - return false; - } - - if (mCandidate.HasParameters || mMethod.HasParameters) { - if (!mCandidate.HasParameters || !mMethod.HasParameters || mCandidate.Parameters.Count != mMethod.Parameters.Count) - return false; - - for (int index = 0; index < mCandidate.Parameters.Count; index++) { - if (!MatchParameters(candidate.ApplyTo(mCandidate.Parameters[index]), method.ApplyTo(mMethod.Parameters[index]))) - return false; - } - } - - return true; - } - - public static bool MatchInterfaceMethod(MethodDefinition candidate, MethodDefinition method, TypeReference interfaceContextType) - { - var candidateContext = CreateGenericContext(candidate.DeclaringType); - var gCandidate = candidateContext.ApplyTo(candidate); - - if (interfaceContextType is GenericInstanceType) { - var methodContext = new GenericContext(interfaceContextType.Resolve(), ((GenericInstanceType)interfaceContextType).GenericArguments); - var gMethod = methodContext.ApplyTo(method); - return MatchMethod(gCandidate, gMethod); - } else { - var methodContext = CreateGenericContext(interfaceContextType.Resolve()); - var gMethod = candidateContext.ApplyTo(method); - return MatchMethod(gCandidate, gMethod); - } - } - - private static bool MatchProperty(GenericContext candidate, GenericContext property) - { - var mCandidate = candidate.Item; - var mProperty = property.Item; - if (mCandidate.Name != mProperty.Name) - return false; - - if ((mCandidate.GetMethod ?? mCandidate.SetMethod).HasOverrides) - return false; - - if (mCandidate.HasParameters || mProperty.HasParameters) { - if (!mCandidate.HasParameters || !mProperty.HasParameters || mCandidate.Parameters.Count != mProperty.Parameters.Count) - return false; - - for (int index = 0; index < mCandidate.Parameters.Count; index++) { - if (!MatchParameters(candidate.ApplyTo(mCandidate.Parameters[index]), property.ApplyTo(mProperty.Parameters[index]))) - return false; - } - } - - return true; - } - - private static bool MatchEvent(GenericContext candidate, GenericContext ev) - { - var mCandidate = candidate.Item; - var mEvent = ev.Item; - if (mCandidate.Name != mEvent.Name) - return false; - - if ((mCandidate.AddMethod ?? mCandidate.RemoveMethod).HasOverrides) - return false; - - if (!IsSameType(candidate.ResolveWithContext(mCandidate.EventType), ev.ResolveWithContext(mEvent.EventType))) - return false; - - return true; - } - - private static bool MatchParameters(GenericContext baseParameterType, GenericContext parameterType) - { - if (baseParameterType.Item.IsIn != parameterType.Item.IsIn || - baseParameterType.Item.IsOut != parameterType.Item.IsOut) - return false; - var baseParam = baseParameterType.ResolveWithContext(baseParameterType.Item.ParameterType); - var param = parameterType.ResolveWithContext(parameterType.Item.ParameterType); - return IsSameType(baseParam, param); - } - - private static bool IsSameType(TypeReference tr1, TypeReference tr2) - { - if (tr1 == tr2) - return true; - if (tr1 == null || tr2 == null) - return false; - - if (tr1.GetType() != tr2.GetType()) - return false; - - if (tr1.Name == tr2.Name && tr1.FullName == tr2.FullName) - return true; - - return false; - } - - private static IEnumerable> BaseTypes(TypeDefinition type) - { - return BaseTypes(CreateGenericContext(type)); - } - - private static IEnumerable> BaseTypes(GenericContext type) - { - while (type.Item.BaseType != null) { - var baseType = type.Item.BaseType; - var genericBaseType = baseType as GenericInstanceType; - if (genericBaseType != null) { - type = new GenericContext(genericBaseType.ResolveOrThrow(), - genericBaseType.GenericArguments.Select(t => type.ResolveWithContext(t))); - } else - type = new GenericContext(baseType.ResolveOrThrow()); - yield return type; - } - } - - private static GenericContext CreateGenericContext(TypeDefinition type) - { - return type.HasGenericParameters - ? new GenericContext(type, type.GenericParameters) - : new GenericContext(type); - } - - struct GenericContext where T : class - { - private static readonly ReadOnlyCollection Empty = new ReadOnlyCollection(new List()); - private static readonly GenericParameter UnresolvedGenericTypeParameter = - new DummyGenericParameterProvider(false).DummyParameter; - private static readonly GenericParameter UnresolvedGenericMethodParameter = - new DummyGenericParameterProvider(true).DummyParameter; - - public readonly T Item; - public readonly ReadOnlyCollection TypeArguments; - - public GenericContext(T item) - { - if (item == null) - throw new ArgumentNullException(nameof(item)); - - Item = item; - TypeArguments = Empty; - } - - public GenericContext(T item, IEnumerable typeArguments) - { - if (item == null) - throw new ArgumentNullException(nameof(item)); - - Item = item; - var list = new List(); - foreach (var arg in typeArguments) { - var resolved = arg != null ? arg.Resolve() : arg; - list.Add(resolved != null ? resolved : arg); - } - TypeArguments = new ReadOnlyCollection(list); - } - - private GenericContext(T item, ReadOnlyCollection typeArguments) - { - Item = item; - TypeArguments = typeArguments; - } - - public TypeReference ResolveWithContext(TypeReference type) - { - var genericParameter = type as GenericParameter; - if (genericParameter != null) - if (genericParameter.Owner.GenericParameterType == GenericParameterType.Type) - return this.TypeArguments[genericParameter.Position]; - else - return genericParameter.Owner.GenericParameterType == GenericParameterType.Type - ? UnresolvedGenericTypeParameter : UnresolvedGenericMethodParameter; - var typeSpecification = type as TypeSpecification; - if (typeSpecification != null) { - var resolvedElementType = ResolveWithContext(typeSpecification.ElementType); - return ReplaceElementType(typeSpecification, resolvedElementType); - } - return type.ResolveOrThrow(); - } - - private TypeReference ReplaceElementType(TypeSpecification ts, TypeReference newElementType) - { - var arrayType = ts as Mono.Cecil.ArrayType; - if (arrayType != null) { - if (newElementType == arrayType.ElementType) - return arrayType; - var newArrayType = new Mono.Cecil.ArrayType(newElementType, arrayType.Rank); - for (int dimension = 0; dimension < arrayType.Rank; dimension++) - newArrayType.Dimensions[dimension] = arrayType.Dimensions[dimension]; - return newArrayType; - } - var byReferenceType = ts as Mono.Cecil.ByReferenceType; - if (byReferenceType != null) { - return new Mono.Cecil.ByReferenceType(newElementType); - } - // TODO: should we throw an exception instead calling Resolve method? - return ts.ResolveOrThrow(); - } - - public GenericContext ApplyTo(T2 item) where T2 : class - { - return new GenericContext(item, this.TypeArguments); - } - - private class DummyGenericParameterProvider : IGenericParameterProvider - { - readonly Mono.Cecil.GenericParameterType type; - readonly Mono.Collections.Generic.Collection parameters; - - public DummyGenericParameterProvider(bool methodTypeParameter) - { - type = methodTypeParameter ? Mono.Cecil.GenericParameterType.Method : - Mono.Cecil.GenericParameterType.Type; - parameters = new Mono.Collections.Generic.Collection(1); - parameters.Add(new GenericParameter(this)); - } - - public GenericParameter DummyParameter - { - get { return parameters[0]; } - } - - bool IGenericParameterProvider.HasGenericParameters - { - get { throw new NotImplementedException(); } - } - - bool IGenericParameterProvider.IsDefinition - { - get { throw new NotImplementedException(); } - } - - ModuleDefinition IGenericParameterProvider.Module - { - get { throw new NotImplementedException(); } - } - - Mono.Collections.Generic.Collection IGenericParameterProvider.GenericParameters - { - get { return parameters; } - } - - GenericParameterType IGenericParameterProvider.GenericParameterType - { - get { return type; } - } - - MetadataToken IMetadataTokenProvider.MetadataToken - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - } - } - } -} diff --git a/ILSpy/VB/ILSpyEnvironmentProvider.cs b/ILSpy/VB/ILSpyEnvironmentProvider.cs deleted file mode 100644 index aece4ba80..000000000 --- a/ILSpy/VB/ILSpyEnvironmentProvider.cs +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2011 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.Collections.Generic; -using System.Linq; - -using ICSharpCode.Decompiler; -using ICSharpCode.NRefactory.TypeSystem; -using ICSharpCode.NRefactory.VB.Visitors; -using Mono.Cecil; - -namespace ICSharpCode.ILSpy.VB -{ - public class ILSpyEnvironmentProvider : IEnvironmentProvider - { - public string RootNamespace { - get { - return ""; - } - } - - //readonly CecilLoader loader = new CecilLoader(); - - public string GetTypeNameForAttribute(NRefactory.CSharp.Attribute attribute) - { - return attribute.Type.Annotations - .OfType() - .First() - .FullName; - } - - public IType ResolveType(NRefactory.VB.Ast.AstType type, NRefactory.VB.Ast.TypeDeclaration entity = null) - { - /* - var annotation = type.Annotation(); - if (annotation == null ) - return null; - - IEntity current = null; - if (entity != null) { - var typeInfo = entity.Annotation(); - current = loader.ReadTypeReference(typeInfo).Resolve(context).GetDefinition(); - } - - return loader.ReadTypeReference(annotation, entity: current).Resolve(context);*/ - return SpecialType.UnknownType; - } - - public TypeKind GetTypeKindForAstType(NRefactory.CSharp.AstType type) - { - var annotation = type.Annotation(); - if (annotation == null) - return TypeKind.Unknown; - - var definition = annotation.ResolveOrThrow(); - if (definition.IsClass) - return TypeKind.Class; - if (definition.IsInterface) - return TypeKind.Interface; - if (definition.IsEnum) - return TypeKind.Enum; - if (definition.IsFunctionPointer) - return TypeKind.Delegate; - if (definition.IsValueType) - return TypeKind.Struct; - - return TypeKind.Unknown; - } - - public TypeCode ResolveExpression(NRefactory.CSharp.Expression expression) - { - var annotation = expression.Annotations.OfType().FirstOrDefault(); - - if (annotation == null || annotation.InferredType == null) - return TypeCode.Object; - - var definition = annotation.InferredType.Resolve(); - - if (definition == null) - return TypeCode.Object; - - switch (definition.FullName) { - case "System.String": - return TypeCode.String; - default: - break; - } - - return TypeCode.Object; - } - - public bool? IsReferenceType(NRefactory.CSharp.Expression expression) - { - if (expression is NRefactory.CSharp.NullReferenceExpression) - return true; - - var annotation = expression.Annotations.OfType().FirstOrDefault(); - - if (annotation == null || annotation.InferredType == null) - return null; - - var definition = annotation.InferredType.Resolve(); - - if (definition == null) - return null; - - return !definition.IsValueType; - } - - public IEnumerable CreateMemberSpecifiersForInterfaces(IEnumerable interfaces) - { - foreach (var type in interfaces) { - var def = type.Annotation().Resolve(); - if (def == null) continue; - foreach (var method in def.Methods.Where(m => !m.Name.StartsWith("get_", StringComparison.Ordinal) && !m.Name.StartsWith("set_", StringComparison.Ordinal))) { - yield return new NRefactory.VB.Ast.InterfaceMemberSpecifier((NRefactory.VB.Ast.AstType)type.Clone(), method.Name); - } - - foreach (var property in def.Properties) { - yield return new NRefactory.VB.Ast.InterfaceMemberSpecifier((NRefactory.VB.Ast.AstType)type.Clone(), property.Name); - } - } - } - - public bool HasEvent(NRefactory.VB.Ast.Expression expression) - { - return expression.Annotation() != null; - } - - public bool IsMethodGroup(NRefactory.CSharp.Expression expression) - { - var methodInfo = expression.Annotation()?.Resolve(); - if (methodInfo != null) { - return !methodInfo.IsGetter && !methodInfo.IsSetter && !methodInfo.IsAddOn && !methodInfo.IsRemoveOn; - } - - return false; - } - - public NRefactory.CSharp.ParameterDeclaration[] GetParametersForProperty(NRefactory.CSharp.PropertyDeclaration property) - { - var propInfo = property.Annotation(); - - if (propInfo == null) - return new NRefactory.CSharp.ParameterDeclaration[0]; - - return propInfo.Parameters.Select(p => new NRefactory.CSharp.ParameterDeclaration(AstBuilder.ConvertType(p.ParameterType), p.Name, GetModifiers(p))).ToArray(); - } - - NRefactory.CSharp.ParameterModifier GetModifiers(ParameterDefinition p) - { - if (p.IsOut && p.IsIn) - return NRefactory.CSharp.ParameterModifier.Ref; - if (p.IsOut) - return NRefactory.CSharp.ParameterModifier.Out; - - return NRefactory.CSharp.ParameterModifier.None; - } - } -} diff --git a/ILSpy/VB/VBLanguage.cs b/ILSpy/VB/VBLanguage.cs deleted file mode 100644 index 351fed6f3..000000000 --- a/ILSpy/VB/VBLanguage.cs +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright (c) 2011 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.Collections.Generic; -using System.ComponentModel.Composition; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Xml; - -using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Ast.Transforms; -using ICSharpCode.ILSpy.XmlDoc; -using ICSharpCode.NRefactory.VB; -using ICSharpCode.NRefactory.VB.Visitors; -using Mono.Cecil; -using CSharp = ICSharpCode.NRefactory.CSharp; - -namespace ICSharpCode.ILSpy.VB -{ - /// - /// Decompiler logic for VB. - /// - [Export(typeof(Language))] - public class VBLanguage : Language - { - readonly Predicate transformAbortCondition = null; - bool showAllMembers = false; - - public VBLanguage() - { - } - - public override string Name { - get { return "VB"; } - } - - public override string FileExtension { - get { return ".vb"; } - } - - public override string ProjectFileExtension { - get { return ".vbproj"; } - } - - public override void WriteCommentLine(ITextOutput output, string comment) - { - output.WriteLine("' " + comment); - } - - public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options) - { - if (options.FullDecompilation && options.SaveAsProjectDirectory != null) { - HashSet directories = new HashSet(StringComparer.OrdinalIgnoreCase); - var files = WriteCodeFilesInProject(assembly.ModuleDefinition, options, directories).ToList(); - files.AddRange(WriteResourceFilesInProject(assembly, options, directories)); - WriteProjectFile(new TextOutputWriter(output), files, assembly.ModuleDefinition); - } else { - base.DecompileAssembly(assembly, output, options); - output.WriteLine(); - ModuleDefinition mainModule = assembly.ModuleDefinition; - if (mainModule.Types.Count > 0) { - output.Write("' Global type: "); - output.WriteReference(mainModule.Types[0].FullName, mainModule.Types[0]); - output.WriteLine(); - } - if (mainModule.EntryPoint != null) { - output.Write("' Entry point: "); - output.WriteReference(mainModule.EntryPoint.DeclaringType.FullName + "." + mainModule.EntryPoint.Name, mainModule.EntryPoint); - output.WriteLine(); - } - WriteCommentLine(output, "Architecture: " + CSharpLanguage.GetPlatformDisplayName(mainModule)); - if ((mainModule.Attributes & ModuleAttributes.ILOnly) == 0) { - WriteCommentLine(output, "This assembly contains unmanaged code."); - } - switch (mainModule.Runtime) { - case TargetRuntime.Net_1_0: - WriteCommentLine(output, "Runtime: .NET 1.0"); - break; - case TargetRuntime.Net_1_1: - WriteCommentLine(output, "Runtime: .NET 1.1"); - break; - case TargetRuntime.Net_2_0: - WriteCommentLine(output, "Runtime: .NET 2.0"); - break; - case TargetRuntime.Net_4_0: - WriteCommentLine(output, "Runtime: .NET 4.0"); - break; - } - output.WriteLine(); - - // don't automatically load additional assemblies when an assembly node is selected in the tree view - using (options.FullDecompilation ? null : LoadedAssembly.DisableAssemblyLoad()) { - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentModule: assembly.ModuleDefinition); - codeDomBuilder.AddAssembly(assembly.ModuleDefinition, onlyAssemblyLevel: !options.FullDecompilation); - RunTransformsAndGenerateCode(codeDomBuilder, output, options, assembly.ModuleDefinition); - } - } - } - - static readonly string[] projectImports = new[] { - "System.Diagnostics", - "Microsoft.VisualBasic", - "System", - "System.Collections", - "System.Collections.Generic" - }; - - #region WriteProjectFile - void WriteProjectFile(TextWriter writer, IEnumerable> files, ModuleDefinition module) - { - const string ns = "http://schemas.microsoft.com/developer/msbuild/2003"; - string platformName = CSharpLanguage.GetPlatformName(module); - Guid guid = App.CommandLineArguments.FixedGuid ?? Guid.NewGuid(); - using (XmlTextWriter w = new XmlTextWriter(writer)) { - w.Formatting = Formatting.Indented; - w.WriteStartDocument(); - w.WriteStartElement("Project", ns); - w.WriteAttributeString("ToolsVersion", "4.0"); - w.WriteAttributeString("DefaultTargets", "Build"); - - w.WriteStartElement("PropertyGroup"); - w.WriteElementString("ProjectGuid", guid.ToString("B").ToUpperInvariant()); - - w.WriteStartElement("Configuration"); - w.WriteAttributeString("Condition", " '$(Configuration)' == '' "); - w.WriteValue("Debug"); - w.WriteEndElement(); // - - w.WriteStartElement("Platform"); - w.WriteAttributeString("Condition", " '$(Platform)' == '' "); - w.WriteValue(platformName); - w.WriteEndElement(); // - - switch (module.Kind) { - case ModuleKind.Windows: - w.WriteElementString("OutputType", "WinExe"); - break; - case ModuleKind.Console: - w.WriteElementString("OutputType", "Exe"); - break; - default: - w.WriteElementString("OutputType", "Library"); - break; - } - - w.WriteElementString("AssemblyName", module.Assembly.Name.Name); - bool useTargetFrameworkAttribute = false; - var targetFrameworkAttribute = module.Assembly.CustomAttributes.FirstOrDefault(a => a.AttributeType.FullName == "System.Runtime.Versioning.TargetFrameworkAttribute"); - if (targetFrameworkAttribute != null && targetFrameworkAttribute.ConstructorArguments.Any()) { - string frameworkName = (string)targetFrameworkAttribute.ConstructorArguments[0].Value; - string[] frameworkParts = frameworkName.Split(','); - string frameworkVersion = frameworkParts.FirstOrDefault(a => a.StartsWith("Version=")); - if (frameworkVersion != null) { - w.WriteElementString("TargetFrameworkVersion", frameworkVersion.Substring("Version=".Length)); - useTargetFrameworkAttribute = true; - } - string frameworkProfile = frameworkParts.FirstOrDefault(a => a.StartsWith("Profile=")); - if (frameworkProfile != null) - w.WriteElementString("TargetFrameworkProfile", frameworkProfile.Substring("Profile=".Length)); - } - if (!useTargetFrameworkAttribute) { - switch (module.Runtime) { - case TargetRuntime.Net_1_0: - w.WriteElementString("TargetFrameworkVersion", "v1.0"); - break; - case TargetRuntime.Net_1_1: - w.WriteElementString("TargetFrameworkVersion", "v1.1"); - break; - case TargetRuntime.Net_2_0: - w.WriteElementString("TargetFrameworkVersion", "v2.0"); - // TODO: Detect when .NET 3.0/3.5 is required - break; - default: - w.WriteElementString("TargetFrameworkVersion", "v4.0"); - break; - } - } - w.WriteElementString("WarningLevel", "4"); - - w.WriteEndElement(); // - - w.WriteStartElement("PropertyGroup"); // platform-specific - w.WriteAttributeString("Condition", " '$(Platform)' == '" + platformName + "' "); - w.WriteElementString("PlatformTarget", platformName); - w.WriteEndElement(); // (platform-specific) - - w.WriteStartElement("PropertyGroup"); // Debug - w.WriteAttributeString("Condition", " '$(Configuration)' == 'Debug' "); - w.WriteElementString("OutputPath", "bin\\Debug\\"); - w.WriteElementString("DebugSymbols", "true"); - w.WriteElementString("DebugType", "full"); - w.WriteElementString("Optimize", "false"); - w.WriteEndElement(); // (Debug) - - w.WriteStartElement("PropertyGroup"); // Release - w.WriteAttributeString("Condition", " '$(Configuration)' == 'Release' "); - w.WriteElementString("OutputPath", "bin\\Release\\"); - w.WriteElementString("DebugSymbols", "true"); - w.WriteElementString("DebugType", "pdbonly"); - w.WriteElementString("Optimize", "true"); - w.WriteEndElement(); // (Release) - - - w.WriteStartElement("ItemGroup"); // References - foreach (AssemblyNameReference r in module.AssemblyReferences) { - if (r.Name != "mscorlib") { - w.WriteStartElement("Reference"); - w.WriteAttributeString("Include", r.Name); - w.WriteEndElement(); - } - } - w.WriteEndElement(); // (References) - - foreach (IGrouping gr in (from f in files group f.Item2 by f.Item1 into g orderby g.Key select g)) { - w.WriteStartElement("ItemGroup"); - foreach (string file in gr.OrderBy(f => f, StringComparer.OrdinalIgnoreCase)) { - w.WriteStartElement(gr.Key); - w.WriteAttributeString("Include", file); - w.WriteEndElement(); - } - w.WriteEndElement(); - } - - w.WriteStartElement("ItemGroup"); // Imports - foreach (var import in projectImports.OrderBy(x => x)) { - w.WriteStartElement("Import"); - w.WriteAttributeString("Include", import); - w.WriteEndElement(); - } - w.WriteEndElement(); // (Imports) - - w.WriteStartElement("Import"); - w.WriteAttributeString("Project", "$(MSBuildToolsPath)\\Microsoft.VisualBasic.targets"); - w.WriteEndElement(); - - w.WriteEndDocument(); - } - } - #endregion - - #region WriteCodeFilesInProject - bool IncludeTypeWhenDecompilingProject(TypeDefinition type, DecompilationOptions options) - { - if (type.Name == "" || AstBuilder.MemberIsHidden(type, options.DecompilerSettings)) - return false; - if (type.Namespace == "XamlGeneratedNamespace" && type.Name == "GeneratedInternalTypeHelper") - return false; - return true; - } - - IEnumerable> WriteAssemblyInfo(ModuleDefinition module, DecompilationOptions options, HashSet directories) - { - // don't automatically load additional assemblies when an assembly node is selected in the tree view - using (LoadedAssembly.DisableAssemblyLoad()) - { - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentModule: module); - codeDomBuilder.AddAssembly(module, onlyAssemblyLevel: true); - codeDomBuilder.RunTransformations(transformAbortCondition); - - string prop = "Properties"; - if (directories.Add("Properties")) - Directory.CreateDirectory(Path.Combine(options.SaveAsProjectDirectory, prop)); - string assemblyInfo = Path.Combine(prop, "AssemblyInfo" + this.FileExtension); - using (StreamWriter w = new StreamWriter(Path.Combine(options.SaveAsProjectDirectory, assemblyInfo))) - codeDomBuilder.GenerateCode(new PlainTextOutput(w)); - return new Tuple[] { Tuple.Create("Compile", assemblyInfo) }; - } - } - - IEnumerable> WriteCodeFilesInProject(ModuleDefinition module, DecompilationOptions options, HashSet directories) - { - var files = module.Types.Where(t => IncludeTypeWhenDecompilingProject(t, options)).GroupBy( - delegate(TypeDefinition type) { - string file = TextView.DecompilerTextView.CleanUpName(type.Name) + this.FileExtension; - if (string.IsNullOrEmpty(type.Namespace)) { - return file; - } else { - string dir = TextView.DecompilerTextView.CleanUpName(type.Namespace); - if (directories.Add(dir)) - Directory.CreateDirectory(Path.Combine(options.SaveAsProjectDirectory, dir)); - return Path.Combine(dir, file); - } - }, StringComparer.OrdinalIgnoreCase).ToList(); - AstMethodBodyBuilder.ClearUnhandledOpcodes(); - Parallel.ForEach( - files, - new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, - delegate(IGrouping file) { - using (StreamWriter w = new StreamWriter(Path.Combine(options.SaveAsProjectDirectory, file.Key))) { - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentModule: module); - foreach (TypeDefinition type in file) { - codeDomBuilder.AddType(type); - } - RunTransformsAndGenerateCode(codeDomBuilder, new PlainTextOutput(w), options, module); - } - }); - AstMethodBodyBuilder.PrintNumberOfUnhandledOpcodes(); - return files.Select(f => Tuple.Create("Compile", f.Key)).Concat(WriteAssemblyInfo(module, options, directories)); - } - #endregion - - public override void DecompileMethod(MethodDefinition method, ITextOutput output, DecompilationOptions options) - { - WriteCommentLine(output, TypeToString(method.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: method.DeclaringType, isSingleMember: true); - codeDomBuilder.AddMethod(method); - RunTransformsAndGenerateCode(codeDomBuilder, output, options, method.Module); - } - - public override void DecompileProperty(PropertyDefinition property, ITextOutput output, DecompilationOptions options) - { - WriteCommentLine(output, TypeToString(property.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: property.DeclaringType, isSingleMember: true); - codeDomBuilder.AddProperty(property); - RunTransformsAndGenerateCode(codeDomBuilder, output, options, property.Module); - } - - public override void DecompileField(FieldDefinition field, ITextOutput output, DecompilationOptions options) - { - WriteCommentLine(output, TypeToString(field.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: field.DeclaringType, isSingleMember: true); - codeDomBuilder.AddField(field); - RunTransformsAndGenerateCode(codeDomBuilder, output, options, field.Module); - } - - public override void DecompileEvent(EventDefinition ev, ITextOutput output, DecompilationOptions options) - { - WriteCommentLine(output, TypeToString(ev.DeclaringType, includeNamespace: true)); - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: ev.DeclaringType, isSingleMember: true); - codeDomBuilder.AddEvent(ev); - RunTransformsAndGenerateCode(codeDomBuilder, output, options, ev.Module); - } - - public override void DecompileType(TypeDefinition type, ITextOutput output, DecompilationOptions options) - { - AstBuilder codeDomBuilder = CreateAstBuilder(options, currentModule: type.Module); - codeDomBuilder.AddType(type); - RunTransformsAndGenerateCode(codeDomBuilder, output, options, type.Module); - } - - public override bool ShowMember(MemberReference member) - { - return showAllMembers || !AstBuilder.MemberIsHidden(member, new DecompilationOptions().DecompilerSettings); - } - - void RunTransformsAndGenerateCode(AstBuilder astBuilder, ITextOutput output, DecompilationOptions options, ModuleDefinition module) - { - astBuilder.RunTransformations(transformAbortCondition); - if (options.DecompilerSettings.ShowXmlDocumentation) { - try { - AddXmlDocTransform.Run(astBuilder.SyntaxTree); - } catch (XmlException ex) { - string[] msg = (" Exception while reading XmlDoc: " + ex.ToString()).Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - var insertionPoint = astBuilder.SyntaxTree.FirstChild; - for (int i = 0; i < msg.Length; i++) - astBuilder.SyntaxTree.InsertChildBefore(insertionPoint, new CSharp.Comment(msg[i], CSharp.CommentType.Documentation), CSharp.Roles.Comment); - } - } - var csharpUnit = astBuilder.SyntaxTree; - csharpUnit.AcceptVisitor(new NRefactory.CSharp.InsertParenthesesVisitor() { InsertParenthesesForReadability = true }); - var unit = csharpUnit.AcceptVisitor(new CSharpToVBConverterVisitor(new ILSpyEnvironmentProvider()), null); - var outputFormatter = new VBTextOutputFormatter(output); - var formattingPolicy = new VBFormattingOptions(); - unit.AcceptVisitor(new OutputVisitor(outputFormatter, formattingPolicy), null); - } - - AstBuilder CreateAstBuilder(DecompilationOptions options, ModuleDefinition currentModule = null, TypeDefinition currentType = null, bool isSingleMember = false) - { - if (currentModule == null) - currentModule = currentType.Module; - DecompilerSettings settings = options.DecompilerSettings; - settings = settings.Clone(); - if (isSingleMember) - settings.UsingDeclarations = false; - settings.IntroduceIncrementAndDecrement = false; - settings.MakeAssignmentExpressions = false; - settings.QueryExpressions = false; - settings.AlwaysGenerateExceptionVariableForCatchBlocks = true; - return new AstBuilder( - new DecompilerContext(currentModule) { - CancellationToken = options.CancellationToken, - CurrentType = currentType, - Settings = settings - }); - } - - public override string FormatMethodName(MethodDefinition method) - { - if (method == null) - throw new ArgumentNullException("method"); - - return (method.IsConstructor) ? method.DeclaringType.Name : method.Name; - } - - public override string FormatTypeName(TypeDefinition type) - { - if (type == null) - throw new ArgumentNullException("type"); - - return TypeToString(ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions, type); - } - - public override string TypeToString(TypeReference type, bool includeNamespace, ICustomAttributeProvider typeAttributes = null) - { - ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions; - if (includeNamespace) - options |= ConvertTypeOptions.IncludeNamespace; - - return TypeToString(options, type, typeAttributes); - } - - string TypeToString(ConvertTypeOptions options, TypeReference type, ICustomAttributeProvider typeAttributes = null) - { - var envProvider = new ILSpyEnvironmentProvider(); - var converter = new CSharpToVBConverterVisitor(envProvider); - var astType = AstBuilder.ConvertType(type, typeAttributes, options); - StringWriter w = new StringWriter(); - - if (type.IsByReference) { - w.Write("ByRef "); - if (astType is NRefactory.CSharp.ComposedType && ((NRefactory.CSharp.ComposedType)astType).PointerRank > 0) - ((NRefactory.CSharp.ComposedType)astType).PointerRank--; - } - - var vbAstType = astType.AcceptVisitor(converter, null); - - vbAstType.AcceptVisitor(new OutputVisitor(w, new VBFormattingOptions()), null); - return w.ToString(); - } - } -} diff --git a/ILSpy/VB/VBTextOutputFormatter.cs b/ILSpy/VB/VBTextOutputFormatter.cs deleted file mode 100644 index ef43e1247..000000000 --- a/ILSpy/VB/VBTextOutputFormatter.cs +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (c) 2011 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.Collections.Generic; -using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.ILAst; -using ICSharpCode.NRefactory.VB; -using ICSharpCode.NRefactory.VB.Ast; -using Mono.Cecil; - -namespace ICSharpCode.ILSpy.VB -{ - /// - /// Description of VBTextOutputFormatter. - /// - public class VBTextOutputFormatter : IOutputFormatter - { - readonly ITextOutput output; - readonly Stack nodeStack = new Stack(); - - bool firstImport, lastImport; - - public VBTextOutputFormatter(ITextOutput output) - { - if (output == null) - throw new ArgumentNullException("output"); - this.output = output; - } - - public void StartNode(AstNode node) - { - // var ranges = node.Annotation>(); - // if (ranges != null && ranges.Count > 0) - // { - // // find the ancestor that has method mapping as annotation - // if (node.Ancestors != null && node.Ancestors.Count() > 0) - // { - // var n = node.Ancestors.FirstOrDefault(a => a.Annotation() != null); - // if (n != null) { - // MemberMapping mapping = n.Annotation(); - // - // // add all ranges - // foreach (var range in ranges) { - // mapping.MemberCodeMappings.Add(new SourceCodeMapping { - // ILInstructionOffset = range, - // SourceCodeLine = output.CurrentLine, - // MemberMapping = mapping - // }); - // } - // } - // } - // } - if (nodeStack.Count == 0) { - if (node is ImportsStatement) { - firstImport = !(node.PrevSibling is ImportsStatement); - lastImport = !(node.NextSibling is ImportsStatement); - } else { - firstImport = false; - lastImport = false; - } - } - nodeStack.Push(node); - } - - public void EndNode(AstNode node) - { - if (nodeStack.Pop() != node) - throw new InvalidOperationException(); - } - - public void WriteIdentifier(string identifier) - { - var definition = GetCurrentDefinition(); - if (definition != null) { - output.WriteDefinition(identifier, definition); - return; - } - - object memberRef = GetCurrentMemberReference(); - if (memberRef != null) { - output.WriteReference(identifier, memberRef); - return; - } - - definition = GetCurrentLocalDefinition(); - if (definition != null) { - output.WriteDefinition(identifier, definition); - return; - } - - memberRef = GetCurrentLocalReference(); - if (memberRef != null) { - output.WriteReference(identifier, memberRef, true); - return; - } - - if (firstImport) { - output.MarkFoldStart(defaultCollapsed: true); - firstImport = false; - } - - output.Write(identifier); - } - - MemberReference GetCurrentMemberReference() - { - AstNode node = nodeStack.Peek(); - MemberReference memberRef = node.Annotation(); - if (memberRef == null && node.Role == AstNode.Roles.TargetExpression && (node.Parent is InvocationExpression || node.Parent is ObjectCreationExpression)) { - memberRef = node.Parent.Annotation(); - } - return memberRef; - } - - object GetCurrentLocalReference() - { - AstNode node = nodeStack.Peek(); - ILVariable variable = node.Annotation(); - if (variable != null) { - if (variable.OriginalParameter != null) - return variable.OriginalParameter; - //if (variable.OriginalVariable != null) - // return variable.OriginalVariable; - return variable; - } - return null; - } - - object GetCurrentLocalDefinition() - { - AstNode node = nodeStack.Peek(); - var parameterDef = node.Annotation(); - if (parameterDef != null) - return parameterDef; - - if (node is VariableInitializer || node is CatchBlock || node is ForEachStatement) { - var variable = node.Annotation(); - if (variable != null) { - if (variable.OriginalParameter != null) - return variable.OriginalParameter; - //if (variable.OriginalVariable != null) - // return variable.OriginalVariable; - return variable; - } else { - - } - } - - return null; - } - - object GetCurrentDefinition() - { - if (nodeStack == null || nodeStack.Count == 0) - return null; - - var node = nodeStack.Peek(); - if (IsDefinition(node)) - return node.Annotation(); - - node = node.Parent; - if (IsDefinition(node)) - return node.Annotation(); - - return null; - } - - public void WriteKeyword(string keyword) - { - output.Write(keyword); - } - - public void WriteToken(string token) - { - // Attach member reference to token only if there's no identifier in the current node. - MemberReference memberRef = GetCurrentMemberReference(); - if (memberRef != null && nodeStack.Peek().GetChildByRole(AstNode.Roles.Identifier).IsNull) - output.WriteReference(token, memberRef); - else - output.Write(token); - } - - public void Space() - { - output.Write(' '); - } - - public void Indent() - { - output.Indent(); - } - - public void Unindent() - { - output.Unindent(); - } - - public void NewLine() - { - if (lastImport) { - output.MarkFoldEnd(); - lastImport = false; - } - output.WriteLine(); - } - - public void WriteComment(bool isDocumentation, string content) - { - if (isDocumentation) - output.Write("'''"); - else - output.Write("'"); - output.WriteLine(content); - } - - public void MarkFoldStart() - { - output.MarkFoldStart(); - } - - public void MarkFoldEnd() - { - output.MarkFoldEnd(); - } - - private static bool IsDefinition(AstNode node) - { - return - node is FieldDeclaration || - node is ConstructorDeclaration || - node is EventDeclaration || - node is DelegateDeclaration || - node is OperatorDeclaration|| - node is MemberDeclaration || - node is TypeDeclaration; - } - } -}