Example #1
0
        IType SearchType(KnownTypeCode typeCode)
        {
            KnownTypeReference typeRef = KnownTypeReference.Get(typeCode);

            if (typeRef == null)
            {
                return(SpecialType.UnknownType);
            }
            ITypeDefinition typeDef;

            foreach (IAssembly asm in compilation.ReferencedAssemblies)
            {
                typeDef = asm.GetTypeDefinition(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount);
                if (typeDef != null)
                {
                    return(typeDef);
                }
            }
            typeDef = compilation.MainAssembly.GetTypeDefinition(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount);
            if (typeDef != null)
            {
                return(typeDef);
            }
            else
            {
                return(new UnknownType(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount));
            }
        }
Example #2
0
        private MinimalCorlib() : base("corlib")
        {
            var types = new DefaultUnresolvedTypeDefinition[KnownTypeReference.KnownTypeCodeCount];

            for (int i = 0; i < types.Length; i++)
            {
                var typeRef = KnownTypeReference.Get((KnownTypeCode)i);
                if (typeRef != null)
                {
                    types[i] = new DefaultUnresolvedTypeDefinition(typeRef.Namespace, typeRef.Name);
                    for (int j = 0; j < typeRef.TypeParameterCount; j++)
                    {
                        types[i].TypeParameters.Add(new DefaultUnresolvedTypeParameter(SymbolKind.TypeDefinition, j));
                    }
                    AddTypeDefinition(types[i]);
                }
            }
            for (int i = 0; i < types.Length; i++)
            {
                var typeRef = KnownTypeReference.Get((KnownTypeCode)i);
                if (typeRef != null && typeRef.baseType != KnownTypeCode.None)
                {
                    types[i].BaseTypes.Add(types[(int)typeRef.baseType]);
                    if (typeRef.baseType == KnownTypeCode.ValueType && i != (int)KnownTypeCode.Enum)
                    {
                        types[i].Kind = TypeKind.Struct;
                    }
                }
            }
            Freeze();
        }
Example #3
0
        SearchScope FindObjectCreateReferences(IMethod ctor)
        {
            ctor = (IMethod)ctor.MemberDefinition;
            string searchTerm = null;

            if (KnownTypeReference.GetCSharpNameByTypeCode(ctor.DeclaringTypeDefinition.KnownTypeCode) == null)
            {
                // not a built-in type
                searchTerm = ctor.DeclaringTypeDefinition.Name;
                if (searchTerm.Length > 9 && searchTerm.EndsWith("Attribute", StringComparison.Ordinal))
                {
                    // we also need to look for the short form
                    searchTerm = null;
                }
            }
            return(new SearchScope(
                       searchTerm,
                       delegate(ICompilation compilation) {
                IMethod imported = compilation.Import(ctor);
                if (imported != null)
                {
                    return new FindObjectCreateReferencesNavigator(imported);
                }
                else
                {
                    return null;
                }
            }));
        }
Example #4
0
            public CorlibTypeDefinition(MinimalCorlib corlib, KnownTypeCode typeCode)
            {
                this.corlib   = corlib;
                this.typeCode = typeCode;
                KnownTypeReference ktr = KnownTypeReference.Get(typeCode);

                this.typeKind     = ktr.typeKind;
                this.MetadataName = ktr.Name + (ktr.TypeParameterCount > 0 ? "`" + ktr.TypeParameterCount : "");
            }
        protected AstType ConvertType(KnownTypeCode knownTypeCode)
        {
            IType type = refactoringContext.Compilation.FindType(knownTypeCode);

            if (type != null)
            {
                return(ConvertType(type));
            }

            // Backup solution
            return(new SimpleType(KnownTypeReference.GetCSharpNameByTypeCode(knownTypeCode)));
        }
 public RequiredNamespaceCollector(HashSet <string> namespaces)
 {
     this.namespaces = namespaces;
     for (int i = 0; i < KnownTypeReference.KnownTypeCodeCount; i++)
     {
         var ktr = KnownTypeReference.Get((KnownTypeCode)i);
         if (ktr == null)
         {
             continue;
         }
         namespaces.Add(ktr.Namespace);
     }
 }
Example #7
0
        public override ITypeReference ToTypeReference(NameLookupMode lookupMode, InterningProvider interningProvider = null)
        {
            KnownTypeCode typeCode = GetTypeCodeForPrimitiveType(this.Keyword);

            if (typeCode == KnownTypeCode.None)
            {
                return(new UnknownType(null, this.Keyword));
            }
            else
            {
                return(KnownTypeReference.Get(typeCode));
            }
        }
Example #8
0
 private MinimalCorlib(ICompilation compilation)
 {
     this.Compilation     = compilation;
     this.typeDefinitions = new CorlibTypeDefinition[KnownTypeReference.KnownTypeCodeCount];
     this.rootNamespace   = new CorlibNamespace(this, null, string.Empty, string.Empty);
     for (int i = 0; i < KnownTypeReference.KnownTypeCodeCount; i++)
     {
         if (KnownTypeReference.Get((KnownTypeCode)i) != null)
         {
             typeDefinitions[i] = new CorlibTypeDefinition(this, (KnownTypeCode)i);
         }
     }
 }
Example #9
0
        public override ITypeReference ToTypeReference(SimpleNameLookupMode lookupMode = SimpleNameLookupMode.Type)
        {
            KnownTypeCode typeCode = GetTypeCodeForPrimitiveType(this.Keyword);

            if (typeCode == KnownTypeCode.None)
            {
                return(new UnknownType(null, this.Keyword));
            }
            else
            {
                return(KnownTypeReference.Get(typeCode));
            }
        }
Example #10
0
        SearchScope FindTypeDefinitionReferences(ITypeDefinition typeDefinition, bool findTypeReferencesEvenIfAliased, out SearchScope additionalScope)
        {
            string searchTerm = null;

            additionalScope = null;
            if (!findTypeReferencesEvenIfAliased && KnownTypeReference.GetCSharpNameByTypeCode(typeDefinition.KnownTypeCode) == null)
            {
                // We can optimize the search by looking only for the type references with the right identifier,
                // but only if it's not a primitive type and we're not looking for indirect references (through an alias)
                searchTerm = typeDefinition.Name;
                if (searchTerm.Length > 9 && searchTerm.EndsWith("Attribute", StringComparison.Ordinal))
                {
                    // The type might be an attribute, so we also need to look for the short form:
                    string shortForm = searchTerm.Substring(0, searchTerm.Length - 9);
                    additionalScope = new SearchScope(
                        shortForm,
                        delegate(ICompilation compilation) {
                        ITypeDefinition imported = compilation.Import(typeDefinition);
                        if (imported != null)
                        {
                            return(new FindTypeDefinitionReferencesNavigator(imported, shortForm));
                        }
                        else
                        {
                            return(null);
                        }
                    });
                }
            }
            return(new SearchScope(
                       searchTerm,
                       delegate(ICompilation compilation) {
                ITypeDefinition imported = compilation.Import(typeDefinition);
                if (imported != null)
                {
                    return new FindTypeDefinitionReferencesNavigator(imported, searchTerm);
                }
                else
                {
                    return null;
                }
            }));
        }
        IType SearchType(KnownTypeCode typeCode)
        {
            KnownTypeReference typeRef = KnownTypeReference.Get(typeCode);

            if (typeRef == null)
            {
                return(SpecialType.UnknownType);
            }
            var typeName = new TopLevelTypeName(typeRef.Namespace, typeRef.Name, typeRef.TypeParameterCount);

            foreach (IAssembly asm in compilation.Assemblies)
            {
                var typeDef = asm.GetTypeDefinition(typeName);
                if (typeDef != null)
                {
                    return(typeDef);
                }
            }
            return(new UnknownType(typeName));
        }
Example #12
0
 public static bool IsKnownType(this EntityHandle handle, MetadataReader reader,
                                KnownTypeCode knownType)
 {
     return(!handle.IsNil &&
            GetFullTypeName(handle, reader) == KnownTypeReference.Get(knownType).TypeName);
 }
        AstType ConvertTypeHelper(ITypeDefinition typeDef, IList <IType> typeArguments)
        {
            Debug.Assert(typeArguments.Count >= typeDef.TypeParameterCount);

            string keyword = KnownTypeReference.GetCSharpNameByTypeCode(typeDef.KnownTypeCode);

            if (keyword != null)
            {
                return(new PrimitiveType(keyword));
            }

            // The number of type parameters belonging to outer classes
            int outerTypeParameterCount;

            if (typeDef.DeclaringType != null)
            {
                outerTypeParameterCount = typeDef.DeclaringType.TypeParameterCount;
            }
            else
            {
                outerTypeParameterCount = 0;
            }

            if (resolver != null)
            {
                // Look if there's an alias to the target type
                if (UseAliases)
                {
                    for (ResolvedUsingScope usingScope = resolver.CurrentUsingScope; usingScope != null; usingScope = usingScope.Parent)
                    {
                        foreach (var pair in usingScope.UsingAliases)
                        {
                            if (pair.Value is TypeResolveResult)
                            {
                                if (TypeMatches(pair.Value.Type, typeDef, typeArguments))
                                {
                                    return(new SimpleType(pair.Key));
                                }
                            }
                        }
                    }
                }

                IList <IType> localTypeArguments;
                if (typeDef.TypeParameterCount > outerTypeParameterCount)
                {
                    localTypeArguments = new IType[typeDef.TypeParameterCount - outerTypeParameterCount];
                    for (int i = 0; i < localTypeArguments.Count; i++)
                    {
                        localTypeArguments[i] = typeArguments[outerTypeParameterCount + i];
                    }
                }
                else
                {
                    localTypeArguments = EmptyList <IType> .Instance;
                }
                ResolveResult     rr  = resolver.ResolveSimpleName(typeDef.Name, localTypeArguments);
                TypeResolveResult trr = rr as TypeResolveResult;
                if (trr != null || (localTypeArguments.Count == 0 && resolver.IsVariableReferenceWithSameType(rr, typeDef.Name, out trr)))
                {
                    if (!trr.IsError && TypeMatches(trr.Type, typeDef, typeArguments))
                    {
                        // We can use the short type name
                        SimpleType shortResult = new SimpleType(typeDef.Name);
                        AddTypeArguments(shortResult, typeDef, typeArguments, outerTypeParameterCount, typeDef.TypeParameterCount);
                        return(shortResult);
                    }
                }
            }

            if (AlwaysUseShortTypeNames)
            {
                var shortResult = new SimpleType(typeDef.Name);
                AddTypeArguments(shortResult, typeDef, typeArguments, outerTypeParameterCount, typeDef.TypeParameterCount);
                return(shortResult);
            }
            MemberType result = new MemberType();

            if (typeDef.DeclaringTypeDefinition != null)
            {
                // Handle nested types
                result.Target = ConvertTypeHelper(typeDef.DeclaringTypeDefinition, typeArguments);
            }
            else
            {
                // Handle top-level types
                if (string.IsNullOrEmpty(typeDef.Namespace))
                {
                    result.Target        = new SimpleType("global");
                    result.IsDoubleColon = true;
                }
                else
                {
                    result.Target = ConvertNamespace(typeDef.Namespace);
                }
            }
            result.MemberName = typeDef.Name;
            AddTypeArguments(result, typeDef, typeArguments, outerTypeParameterCount, typeDef.TypeParameterCount);
            return(result);
        }
        void FormatLineInternal(ITextEditor textArea, int lineNr, int cursorOffset, char ch)
        {
            IDocumentLine curLine    = textArea.Document.GetLineByNumber(lineNr);
            IDocumentLine lineAbove  = lineNr > 1 ? textArea.Document.GetLineByNumber(lineNr - 1) : null;
            string        terminator = DocumentUtilities.GetLineTerminator(textArea.Document, lineNr);

            string curLineText;

            // local string for curLine segment
            if (ch == '/')
            {
                curLineText = textArea.Document.GetText(curLine);
                string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove);
                if (curLineText != null && curLineText.EndsWith("///", StringComparison.Ordinal) && (lineAboveText == null || !lineAboveText.Trim().StartsWith("///", StringComparison.Ordinal)))
                {
                    string            indentation = DocumentUtilities.GetWhitespaceAfter(textArea.Document, curLine.Offset);
                    IUnresolvedEntity member      = GetMemberAfter(textArea, lineNr);
                    if (member != null)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append(" <summary>");
                        sb.Append(terminator);
                        sb.Append(indentation);
                        sb.Append("/// ");
                        sb.Append(terminator);
                        sb.Append(indentation);
                        sb.Append("/// </summary>");

                        IUnresolvedMethod method = null;
                        if (member is IUnresolvedMethod)
                        {
                            method = (IUnresolvedMethod)member;
                        }
                        else if (member is IUnresolvedTypeDefinition)
                        {
                            IUnresolvedTypeDefinition type = (IUnresolvedTypeDefinition)member;
                            if (type.Kind == TypeKind.Delegate)
                            {
                                method = type.Methods.FirstOrDefault(m => m.Name == "Invoke");
                            }
                        }

                        if (method != null)
                        {
                            for (int i = 0; i < method.Parameters.Count; ++i)
                            {
                                sb.Append(terminator);
                                sb.Append(indentation);
                                sb.Append("/// <param name=\"");
                                sb.Append(method.Parameters[i].Name);
                                sb.Append("\"></param>");
                            }
                            if (!method.IsConstructor)
                            {
                                KnownTypeReference returnType = method.ReturnType as KnownTypeReference;
                                if (returnType == null || returnType.KnownTypeCode != KnownTypeCode.Void)
                                {
                                    sb.Append(terminator);
                                    sb.Append(indentation);
                                    sb.Append("/// <returns></returns>");
                                }
                            }
                        }

                        textArea.Document.Insert(cursorOffset, sb.ToString());
                        textArea.Caret.Offset = cursorOffset + indentation.Length + "/// ".Length + " <summary>".Length + terminator.Length;
                    }
                }
                return;
            }

            if (ch != '\n' && ch != '>')
            {
                if (IsInsideStringOrComment(textArea, curLine, cursorOffset))
                {
                    return;
                }
            }
            switch (ch)
            {
            case '>':
                if (IsInsideDocumentationComment(textArea, curLine, cursorOffset))
                {
                    curLineText = textArea.Document.GetText(curLine);
                    int column = cursorOffset - curLine.Offset;
                    int index  = Math.Min(column - 1, curLineText.Length - 1);

                    while (index >= 0 && curLineText[index] != '<')
                    {
                        --index;
                        if (curLineText[index] == '/')
                        {
                            return;                                     // the tag was an end tag or already
                        }
                    }

                    if (index > 0)
                    {
                        StringBuilder commentBuilder = new StringBuilder("");
                        for (int i = index; i < curLineText.Length && i < column && !Char.IsWhiteSpace(curLineText[i]); ++i)
                        {
                            commentBuilder.Append(curLineText[i]);
                        }
                        string tag = commentBuilder.ToString().Trim();
                        if (!tag.EndsWith(">", StringComparison.Ordinal))
                        {
                            tag += ">";
                        }
                        if (!tag.StartsWith("/", StringComparison.Ordinal))
                        {
                            textArea.Document.Insert(cursorOffset, "</" + tag.Substring(1), AnchorMovementType.BeforeInsertion);
                        }
                    }
                }
                break;

            case ':':
            case ')':
            case ']':
            case '{':
                //if (textArea.Document.TextEditorProperties.IndentStyle == IndentStyle.Smart) {
                IndentLine(textArea, curLine);
                //}
                break;

            case '}':
                // Try to get corresponding block beginning brace
                var bracketSearchResult = textArea.Language.BracketSearcher.SearchBracket(textArea.Document, cursorOffset);
                if (bracketSearchResult != null)
                {
                    // Format the block
                    if (!FormatStatement(textArea, cursorOffset, bracketSearchResult.OpeningBracketOffset))
                    {
                        // No auto-formatting seems to be active, at least indent the line
                        IndentLine(textArea, curLine);
                    }
                }
                break;

            case ';':
                // Format this line
                if (!FormatStatement(textArea, cursorOffset, cursorOffset))
                {
                    // No auto-formatting seems to be active, at least indent the line
                    IndentLine(textArea, curLine);
                }
                break;

            case '\n':
                string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove);
                // curLine might have some text which should be added to indentation
                curLineText = textArea.Document.GetText(curLine);

                if (lineAboveText != null && lineAboveText.Trim().StartsWith("#region", StringComparison.Ordinal) &&
                    NeedEndregion(textArea.Document))
                {
                    textArea.Document.Insert(cursorOffset, "#endregion");
                    return;
                }

                IHighlighter highlighter          = textArea.GetService(typeof(IHighlighter)) as IHighlighter;
                bool         isInMultilineComment = false;
                bool         isInMultilineString  = false;
                if (highlighter != null && lineAbove != null)
                {
                    var spanStack = highlighter.GetColorStack(lineNr).Select(c => c.Name).ToArray();
                    isInMultilineComment = spanStack.Contains(HighlighterKnownSpanNames.Comment);
                    isInMultilineString  = spanStack.Contains(HighlighterKnownSpanNames.String);
                }
                bool isInNormalCode = !(isInMultilineComment || isInMultilineString);

                if (lineAbove != null && isInMultilineComment)
                {
                    string lineAboveTextTrimmed = lineAboveText.TrimStart();
                    if (lineAboveTextTrimmed.StartsWith("/*", StringComparison.Ordinal))
                    {
                        textArea.Document.Insert(cursorOffset, " * ");
                        return;
                    }

                    if (lineAboveTextTrimmed.StartsWith("*", StringComparison.Ordinal))
                    {
                        textArea.Document.Insert(cursorOffset, "* ");
                        return;
                    }
                }

                if (lineAbove != null && isInNormalCode)
                {
                    IDocumentLine nextLine     = lineNr + 1 <= textArea.Document.LineCount ? textArea.Document.GetLineByNumber(lineNr + 1) : null;
                    string        nextLineText = (nextLine != null) ? textArea.Document.GetText(nextLine) : "";

                    int indexAbove = lineAboveText.IndexOf("///", StringComparison.Ordinal);
                    int indexNext  = nextLineText.IndexOf("///", StringComparison.Ordinal);
                    if (indexAbove > 0 && (indexNext != -1 || indexAbove + 4 < lineAbove.Length))
                    {
                        textArea.Document.Insert(cursorOffset, "/// ");
                        return;
                    }

                    if (IsInNonVerbatimString(lineAboveText, curLineText))
                    {
                        textArea.Document.Insert(cursorOffset, "\"");
                        textArea.Document.Insert(lineAbove.Offset + lineAbove.Length,
                                                 "\" +");
                    }
                }
                if (textArea.Options.AutoInsertBlockEnd && lineAbove != null && isInNormalCode)
                {
                    string oldLineText = textArea.Document.GetText(lineAbove);
                    if (oldLineText.EndsWith("{", StringComparison.Ordinal))
                    {
                        if (NeedCurlyBracket(textArea.Document.Text))
                        {
                            int insertionPoint = curLine.Offset + curLine.Length;
                            textArea.Document.Insert(insertionPoint, terminator + "}");
                            IndentLine(textArea, textArea.Document.GetLineByNumber(lineNr + 1));
                            textArea.Caret.Offset = insertionPoint;
                        }
                    }
                }
                return;
            }
        }
Example #15
0
            public BamlDecompilerTypeSystem(PEFile mainModule, IAssemblyResolver assemblyResolver)
            {
                if (mainModule == null)
                {
                    throw new ArgumentNullException(nameof(mainModule));
                }
                if (assemblyResolver == null)
                {
                    throw new ArgumentNullException(nameof(assemblyResolver));
                }
                // Load referenced assemblies and type-forwarder references.
                // This is necessary to make .NET Core/PCL binaries work better.
                var referencedAssemblies   = new List <PEFile>();
                var assemblyReferenceQueue = new Queue <(bool IsAssembly, PEFile MainModule, object Reference)>();
                var mainMetadata           = mainModule.Metadata;

                foreach (var h in mainMetadata.GetModuleReferences())
                {
                    var moduleRef  = mainMetadata.GetModuleReference(h);
                    var moduleName = mainMetadata.GetString(moduleRef.Name);
                    foreach (var fileHandle in mainMetadata.AssemblyFiles)
                    {
                        var file = mainMetadata.GetAssemblyFile(fileHandle);
                        if (mainMetadata.StringComparer.Equals(file.Name, moduleName) && file.ContainsMetadata)
                        {
                            assemblyReferenceQueue.Enqueue((false, mainModule, moduleName));
                            break;
                        }
                    }
                }
                foreach (var refs in mainModule.AssemblyReferences)
                {
                    assemblyReferenceQueue.Enqueue((true, mainModule, refs));
                }
                foreach (var bamlReference in defaultBamlReferences)
                {
                    assemblyReferenceQueue.Enqueue((true, mainModule, AssemblyNameReference.Parse(bamlReference)));
                }
                var comparer = KeyComparer.Create(((bool IsAssembly, PEFile MainModule, object Reference)reference) =>
                                                  reference.IsAssembly ? "A:" + ((IAssemblyReference)reference.Reference).FullName :
                                                  "M:" + reference.Reference);
                var processedAssemblyReferences = new HashSet <(bool IsAssembly, PEFile Parent, object Reference)>(comparer);

                while (assemblyReferenceQueue.Count > 0)
                {
                    var asmRef = assemblyReferenceQueue.Dequeue();
                    if (!processedAssemblyReferences.Add(asmRef))
                    {
                        continue;
                    }
                    PEFile asm;
                    if (asmRef.IsAssembly)
                    {
                        asm = assemblyResolver.Resolve((IAssemblyReference)asmRef.Reference);
                    }
                    else
                    {
                        asm = assemblyResolver.ResolveModule(asmRef.MainModule, (string)asmRef.Reference);
                    }
                    if (asm != null)
                    {
                        referencedAssemblies.Add(asm);
                        var metadata = asm.Metadata;
                        foreach (var h in metadata.ExportedTypes)
                        {
                            var exportedType = metadata.GetExportedType(h);
                            switch (exportedType.Implementation.Kind)
                            {
                            case SRM.HandleKind.AssemblyReference:
                                assemblyReferenceQueue.Enqueue((true, asm, new AssemblyReference(asm, (SRM.AssemblyReferenceHandle)exportedType.Implementation)));
                                break;

                            case SRM.HandleKind.AssemblyFile:
                                var file = metadata.GetAssemblyFile((SRM.AssemblyFileHandle)exportedType.Implementation);
                                assemblyReferenceQueue.Enqueue((false, asm, metadata.GetString(file.Name)));
                                break;
                            }
                        }
                    }
                }
                var mainModuleWithOptions           = mainModule.WithOptions(TypeSystemOptions.Default);
                var referencedAssembliesWithOptions = referencedAssemblies.Select(file => file.WithOptions(TypeSystemOptions.Default));

                // Primitive types are necessary to avoid assertions in ILReader.
                // Fallback to MinimalCorlib to provide the primitive types.
                if (!HasType(KnownTypeCode.Void) || !HasType(KnownTypeCode.Int32))
                {
                    Init(mainModule.WithOptions(TypeSystemOptions.Default), referencedAssembliesWithOptions.Concat(new[] { MinimalCorlib.Instance }));
                }
                else
                {
                    Init(mainModuleWithOptions, referencedAssembliesWithOptions);
                }
                this.MainModule = (MetadataModule)base.MainModule;

                bool HasType(KnownTypeCode code)
                {
                    TopLevelTypeName name = KnownTypeReference.Get(code).TypeName;

                    if (mainModule.GetTypeDefinition(name) != null)
                    {
                        return(true);
                    }
                    foreach (var file in referencedAssemblies)
                    {
                        if (file.GetTypeDefinition(name) != null)
                        {
                            return(true);
                        }
                    }
                    return(false);
                }
            }
        internal MetadataTypeDefinition(MetadataModule module, TypeDefinitionHandle handle)
        {
            Debug.Assert(module != null);
            Debug.Assert(!handle.IsNil);
            this.module = module;
            this.handle = handle;
            var metadata = module.metadata;
            var td       = metadata.GetTypeDefinition(handle);

            this.attributes   = td.Attributes;
            this.fullTypeName = td.GetFullTypeName(metadata);
            // Find DeclaringType + KnownTypeCode:
            if (fullTypeName.IsNested)
            {
                this.DeclaringTypeDefinition = module.GetDefinition(td.GetDeclaringType());

                // Create type parameters:
                this.TypeParameters = MetadataTypeParameter.Create(module, this.DeclaringTypeDefinition, this, td.GetGenericParameters());
            }
            else
            {
                // Create type parameters:
                this.TypeParameters = MetadataTypeParameter.Create(module, this, td.GetGenericParameters());

                var topLevelTypeName = fullTypeName.TopLevelTypeName;
                for (int i = 0; i < KnownTypeReference.KnownTypeCodeCount; i++)
                {
                    var ktr = KnownTypeReference.Get((KnownTypeCode)i);
                    if (ktr != null && ktr.TypeName == topLevelTypeName)
                    {
                        this.KnownTypeCode = (KnownTypeCode)i;
                        break;
                    }
                }
            }
            // Find type kind:
            if ((attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface)
            {
                this.Kind = TypeKind.Interface;
            }
            else if (td.IsEnum(metadata, out var underlyingType))
            {
                this.Kind = TypeKind.Enum;
                this.EnumUnderlyingType = module.Compilation.FindType(underlyingType.ToKnownTypeCode());
            }
            else if (td.IsValueType(metadata))
            {
                if (KnownTypeCode == KnownTypeCode.Void)
                {
                    this.Kind = TypeKind.Void;
                }
                else
                {
                    this.Kind        = TypeKind.Struct;
                    this.IsByRefLike = td.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.IsByRefLike);
                    this.IsReadOnly  = td.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.IsReadOnly);
                }
            }
            else if (td.IsDelegate(metadata))
            {
                this.Kind = TypeKind.Delegate;
            }
            else
            {
                this.Kind = TypeKind.Class;
                this.HasExtensionMethods = this.IsStatic &&
                                           (module.TypeSystemOptions & TypeSystemOptions.ExtensionMethods) == TypeSystemOptions.ExtensionMethods &&
                                           td.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.Extension);
            }
        }
Example #17
0
        public AstType ConvertTypeReference(ITypeReference typeRef)
        {
            ArrayTypeReference array = typeRef as ArrayTypeReference;

            if (array != null)
            {
                return(ConvertTypeReference(array.ElementType).MakeArrayType(array.Dimensions));
            }
            PointerTypeReference pointer = typeRef as PointerTypeReference;

            if (pointer != null)
            {
                return(ConvertTypeReference(pointer.ElementType).MakePointerType());
            }
            ByReferenceType brt = typeRef as ByReferenceType;

            if (brt != null)
            {
                return(ConvertTypeReference(brt.ElementType));
            }

            IType type = typeRef.Resolve(context);

            if (type.Kind != TypeKind.Unknown)
            {
                return(ConvertType(type));
            }
            // Unknown type, let's try if we can find an appropriate type
            // (anything is better than displaying a question mark)
            KnownTypeReference knownType = typeRef as KnownTypeReference;

            if (knownType != null)
            {
                string keyword = ReflectionHelper.GetCSharpNameByTypeCode(knownType.TypeCode);
                if (keyword != null)
                {
                    return(new PrimitiveType(keyword));
                }
            }
            SimpleTypeOrNamespaceReference str = typeRef as SimpleTypeOrNamespaceReference;

            if (str != null)
            {
                return(new SimpleType(str.Identifier, str.TypeArguments.Select(ConvertTypeReference)));
            }
            MemberTypeOrNamespaceReference mtr = typeRef as MemberTypeOrNamespaceReference;

            if (mtr != null)
            {
                return(new MemberType(ConvertTypeReference(mtr.Target), mtr.Identifier, mtr.TypeArguments.Select(ConvertTypeReference))
                {
                    IsDoubleColon = mtr.Target is AliasNamespaceReference
                });
            }
            AliasNamespaceReference alias = typeRef as AliasNamespaceReference;

            if (alias != null)
            {
                return(new SimpleType(alias.Identifier));
            }
            // Unknown type reference that couldn't be resolved
            return(new SimpleType("?"));
        }
Example #18
0
 public CorlibTypeDefinition(MinimalCorlib corlib, KnownTypeCode typeCode)
 {
     this.corlib   = corlib;
     this.typeCode = typeCode;
     this.typeKind = KnownTypeReference.Get(typeCode).typeKind;
 }
Example #19
0
        static void AppendTypeName(StringBuilder b, ITypeReference type, ITypeResolveContext context)
        {
            IType resolvedType = type as IType;

            if (resolvedType != null)
            {
                AppendTypeName(b, resolvedType);
                return;
            }
            KnownTypeReference knownType = type as KnownTypeReference;

            if (knownType != null)
            {
                if (!string.IsNullOrEmpty(knownType.Namespace))
                {
                    b.Append(knownType.Namespace);
                    b.Append('.');
                }
                b.Append(knownType.Name);
                return;
            }
            GetClassTypeReference gctr = type as GetClassTypeReference;

            if (gctr != null)
            {
                if (!string.IsNullOrEmpty(gctr.Namespace))
                {
                    b.Append(gctr.Namespace);
                    b.Append('.');
                }
                b.Append(gctr.Name);
                if (gctr.TypeParameterCount > 0)
                {
                    b.Append('`');
                    b.Append(gctr.TypeParameterCount);
                }
                return;
            }
            NestedTypeReference ntr = type as NestedTypeReference;

            if (ntr != null)
            {
                AppendTypeName(b, ntr.DeclaringTypeReference, context);
                b.Append('.');
                b.Append(ntr.Name);
                if (ntr.AdditionalTypeParameterCount > 0)
                {
                    b.Append('`');
                    b.Append(ntr.AdditionalTypeParameterCount);
                }
                return;
            }
            ParameterizedTypeReference pt = type as ParameterizedTypeReference;

            if (pt != null && IsGetClassTypeReference(pt.GenericType))
            {
                AppendParameterizedTypeName(b, pt.GenericType, pt.TypeArguments, context);
                return;
            }
            ArrayTypeReference array = type as ArrayTypeReference;

            if (array != null)
            {
                AppendTypeName(b, array.ElementType, context);
                b.Append('[');
                if (array.Dimensions > 1)
                {
                    for (int i = 0; i < array.Dimensions; i++)
                    {
                        if (i > 0)
                        {
                            b.Append(',');
                        }
                        b.Append("0:");
                    }
                }
                b.Append(']');
                return;
            }
            PointerTypeReference ptr = type as PointerTypeReference;

            if (ptr != null)
            {
                AppendTypeName(b, ptr.ElementType, context);
                b.Append('*');
                return;
            }
            ByReferenceTypeReference brtr = type as ByReferenceTypeReference;

            if (brtr != null)
            {
                AppendTypeName(b, brtr.ElementType, context);
                b.Append('@');
                return;
            }
            if (context == null)
            {
                b.Append('?');
            }
            else
            {
                AppendTypeName(b, type.Resolve(context));
            }
        }