예제 #1
0
 public virtual void VisitFunctionPointer(IFunctionPointer type)
 {
 }
예제 #2
0
        private string GetName(bool fullname)
        {
            if (tref != null)
            {
                string name = tref.Name.Replace(".", "::").Replace("+", "::");

                if (!fullname)
                {
                    string special;
                    if (tref.Namespace == "System" && specialTypeNames.TryGetValue(name, out special))
                    {
                        name = special;
                    }
                }

                ITypeCollection genericArguments = tref.GenericArguments;
                if (genericArguments.Count > 0)
                {
                    System.Text.StringBuilder build = new System.Text.StringBuilder(name);

                    build.Append('<');
                    bool first = true;
                    foreach (IType type1 in genericArguments)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            build.Append(", ");
                        }
                        build.Append(new TypeRef(type1).GetNameWithRef(fullname));
                    }
                    build.Append('>');

                    name = build.ToString();
                }

                return(fullname?RawNamespace + name:name);
            }

            IArrayType type2 = type as IArrayType;

            if (type2 != null)
            {
                string name = type2.Dimensions.Count <= 1?"":", " + type2.Dimensions.Count.ToString();
                return("array<" + new TypeRef(type2.ElementType).GetNameWithRef(fullname) + name + ">");
            }

            IPointerType type4 = type as IPointerType;

            if (type4 != null)
            {
                return(new TypeRef(type4.ElementType).GetNameWithRef(fullname) + "*");
            }

            IReferenceType type3 = type as IReferenceType;

            if (type3 != null)
            {
                return(new TypeRef(type3.ElementType).GetNameWithRef(fullname) + "%");
            }

            IOptionalModifier modifier2 = type as IOptionalModifier;

            if (modifier2 != null)
            {
                return(Modify(new TypeRef(modifier2.Modifier), new TypeRef(modifier2.ElementType), fullname, false));
            }

            IRequiredModifier modifier = type as IRequiredModifier;

            if (modifier != null)
            {
                return(Modify(new TypeRef(modifier.Modifier), new TypeRef(modifier.ElementType), fullname, true));
            }

            IGenericParameter parameter = type as IGenericParameter;

            if (parameter != null)
            {
                return(parameter.Name);
            }

            IGenericArgument argument = type as IGenericArgument;

            if (argument != null)
            {
                return(new TypeRef(argument.Resolve()).GetNameWithRef(fullname));
            }

            IFunctionPointer fptr = type as IFunctionPointer;

            if (fptr != null)
            {
                System.Text.StringBuilder build = new System.Text.StringBuilder();
                build.Append("(");
                build.Append(new TypeRef(fptr.ReturnType.Type).GetNameWithRef(fullname));
                build.Append(" (*)(");
                bool first = true;
                foreach (IParameterDeclaration declaration in fptr.Parameters)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        build.Append(", ");
                    }
                    build.Append(new TypeRef(declaration.ParameterType).GetNameWithRef(fullname));
                }
                build.Append("))");
                return(build.ToString());
            }

            if (type is IValueTypeConstraint)
            {
                return("value class");
            }
            else if (type is IDefaultConstructorConstraint)
            {
                return("<DefaultConstructorConstraint>");
            }

            return("<不明な型>");
        }
예제 #3
0
        public string WriteName(LanguageWriter w)
        {
            if (tref != null)
            {
                string name = tref.Name.Replace(".", "::").Replace("+", "::");

                string special;
                if (tref.Namespace == "System" && specialTypeNames.TryGetValue(name, out special))
                {
                    name = special;
                }

                name = NameMangling.UnDecorateName(name);

                w.WriteReference(name, this.FullName, tref);

                ITypeCollection genericArguments = tref.GenericArguments;
                if (genericArguments.Count > 0)
                {
                    w.Write("<");
                    bool first = true;
                    foreach (IType type1 in genericArguments)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            w.Write(", ");
                        }
                        new TypeRef(type1).WriteNameWithRef(w);
                    }
                    w.Write(">");
                }

                return(name);
            }

            IArrayType type2 = type as IArrayType;

            if (type2 != null)
            {
                w.WriteKeyword("array");
                w.Write("<");
                new TypeRef(type2.ElementType).WriteNameWithRef(w);

                if (type2.Dimensions.Count > 1)
                {
                    w.Write(", ");
                    w.WriteAsLiteral(type2.Dimensions.Count);
                }
                w.Write(">");
            }

            IPointerType type4 = type as IPointerType;

            if (type4 != null)
            {
                new TypeRef(type4.ElementType).WriteNameWithRef(w);
                w.Write("*");
            }

            IReferenceType type3 = type as IReferenceType;

            if (type3 != null)
            {
                new TypeRef(type3.ElementType).WriteNameWithRef(w);
                w.Write("%");
            }

            IOptionalModifier modifier2 = type as IOptionalModifier;

            if (modifier2 != null)
            {
                WriteModify(w, new TypeRef(modifier2.Modifier), new TypeRef(modifier2.ElementType), false);
            }

            IRequiredModifier modifier = type as IRequiredModifier;

            if (modifier != null)
            {
                WriteModify(w, new TypeRef(modifier.Modifier), new TypeRef(modifier.ElementType), true);
            }

            IFunctionPointer fptr = type as IFunctionPointer;

            if (fptr != null)
            {
                w.Write("(");
                new TypeRef(fptr.ReturnType.Type).WriteNameWithRef(w);
                w.Write(" (*)(");
                bool first = true;
                foreach (IParameterDeclaration declaration in fptr.Parameters)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        w.Write(", ");
                    }
                    new TypeRef(declaration.ParameterType).WriteNameWithRef(w);
                }
                w.Write("))");
            }

            IGenericParameter parameter = type as IGenericParameter;

            if (parameter != null)
            {
                w.WriteReference(parameter.Name, "/* ジェネリックパラメータ */ " + parameter.Name, null);
            }

            IGenericArgument argument = type as IGenericArgument;

            if (argument != null)
            {
                new TypeRef(argument.Resolve()).WriteNameWithRef(w);
            }

            if (type is IValueTypeConstraint)
            {
                w.WriteKeyword("value class");
            }
            else if (type is IDefaultConstructorConstraint)
            {
                w.Write("<DefaultConstructorConstraint>");
            }

            return("<不明な型>");
        }
        private string GetTypeText(IType value)
        {
            ITypeReference typeReference = value as ITypeReference;

            if (typeReference != null)
            {
                string specialName = this.GetTypeSpecialNameText(typeReference);
                if ((specialName != null) && (specialName.Length > 0))
                {
                    return(specialName);
                }

                string typeReferenceText = this.GetTypeReferenceText(typeReference);
                return(typeReferenceText);
            }

            IPointerType pointerType = value as IPointerType;

            if (pointerType != null)
            {
                return(this.GetTypeText(pointerType.ElementType) + "*");
            }

            IReferenceType referenceType = value as IReferenceType;

            if (referenceType != null)
            {
                return(this.GetTypeText(referenceType.ElementType) + "&");
            }

            IArrayType arrayType = value as IArrayType;

            if (arrayType != null)
            {
                using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture))
                {
                    writer.Write(this.GetTypeText(arrayType.ElementType));
                    writer.Write("[");

                    IArrayDimensionCollection dimensions = arrayType.Dimensions;
                    for (int i = 0; i < dimensions.Count; i++)
                    {
                        if (i != 0)
                        {
                            writer.Write(",");
                        }

                        int lowerBound = dimensions[i].LowerBound;
                        int upperBound = dimensions[i].UpperBound;

                        if (lowerBound != -1)
                        {
                            writer.Write(lowerBound.ToString(CultureInfo.InvariantCulture));
                        }

                        if ((lowerBound != -1) || (upperBound != -1))
                        {
                            writer.Write(":");
                        }

                        if (upperBound != -1)
                        {
                            writer.Write(upperBound.ToString(CultureInfo.InvariantCulture));
                        }
                    }

                    writer.Write("]");
                    return(writer.ToString());
                }
            }

            IOptionalModifier optionalModifier = value as IOptionalModifier;

            if (optionalModifier != null)
            {
                return("{optional:" + this.GetTypeText(optionalModifier.Modifier) + "}" + this.GetTypeText(optionalModifier.ElementType));
            }

            IRequiredModifier requiredModifier = value as IRequiredModifier;

            if (requiredModifier != null)
            {
                return("{required:" + this.GetTypeText(requiredModifier.Modifier) + "}" + this.GetTypeText(requiredModifier.ElementType));
            }

            IFunctionPointer functionPointer = value as IFunctionPointer;

            if (functionPointer != null)
            {
                using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture))
                {
                    writer.Write("*");
                    writer.Write("(");

                    for (int i = 0; i < functionPointer.Parameters.Count; i++)
                    {
                        if (i != 0)
                        {
                            writer.Write(",");
                        }

                        writer.Write(this.GetTypeText(functionPointer.Parameters[i].ParameterType));
                    }

                    writer.Write(")");
                    writer.Write(":");
                    writer.Write(this.GetTypeText(functionPointer.ReturnType.Type));
                    return(writer.ToString());
                }
            }

            IGenericParameter genericParameter = value as IGenericParameter;

            if (genericParameter != null)
            {
                return(genericParameter.Name);
            }

            IGenericArgument genericArgument = value as IGenericArgument;

            if (genericArgument != null)
            {
                ITypeReference genericType = genericArgument.Owner as ITypeReference;
                if (genericType != null)
                {
                    return("<!" + genericArgument.Position.ToString(CultureInfo.InvariantCulture) + ">");
                }

                IMethodReference genericMethod = genericArgument.Owner as IMethodReference;
                if (genericMethod != null)
                {
                    return("<!!" + genericArgument.Position.ToString(CultureInfo.InvariantCulture) + ">");
                }
            }

            throw new NotSupportedException("Invalid type in code identifier.");
        }
예제 #5
0
 public virtual void VisitFunctionPointer(IFunctionPointer type)
 {
 }
 public virtual IType TransformFunctionPointer(IFunctionPointer value)
 {
     return value;
 }