예제 #1
0
        public void GetReturnType()
        {
            SignatureParser parser        = new SignatureParser();
            TypeReference   typeReference = parser.GetReturnType("()I");

            Assert.AreEqual("java.lang.Integer", typeReference.Type);
            Assert.IsNull(typeReference.RankSpecifier);

            typeReference = parser.GetReturnType("()[B");
            Assert.AreEqual("java.lang.Byte", typeReference.Type);
            Assert.AreEqual(new int[1], typeReference.RankSpecifier);

            Assert.AreEqual("java.lang.Boolean", parser.GetReturnType("(Ljava.lang.Object;)Z").Type);

            typeReference = parser.GetReturnType("(C)Ljava.lang.Character$UnicodeBlock;");
            Assert.AreEqual("java.lang.Character.UnicodeBlock", typeReference.Type);

            typeReference = parser.GetReturnType("(Ljava.lang.String;)Ljava.lang.Package;");
            Assert.AreEqual("java.lang.Package", typeReference.Type);

            typeReference = parser.GetReturnType("()[Ljava.lang.Package;");
            Assert.AreEqual("java.lang.Package", typeReference.Type);
            Assert.AreEqual(new int[1], typeReference.RankSpecifier);
        }
        private TypeDeclaration GetTypeDeclaration(ClassFile clazz)
        {
            TypeDeclaration typeDeclaration = new TypeDeclaration(Modifiers.None, null);

            if (clazz.IsInterface)
            {
                typeDeclaration.Type = ClassType.Interface;
            }
            else
            {
                typeDeclaration.Modifier = Modifiers.Abstract;
            }

            typeDeclaration.Name = clazz.Name;
            if (clazz.Name.IndexOf("$") == -1)
            {
                typeDeclaration.Name = GetTypeName(clazz.Name);
            }
            foreach (ClassFile.Method method in clazz.Methods)
            {
                if (!(method.IsPublic || method.IsProtected))
                {
                    continue;
                }
                ParametrizedNode methodDeclaration;
                if (method.Name == "<init>")
                {
                    methodDeclaration = new ConstructorDeclaration(typeDeclaration.Name, Modifiers.Public, null, null);
                }
                else
                {
                    TypeReference returnType = sigParser.GetReturnType(method.Signature);
                    methodDeclaration = new MethodDeclaration(method.Name, Modifiers.None, returnType, null, null);
                    if (method.IsAbstract)
                    {
                        methodDeclaration.Modifier |= Modifiers.Abstract;
                    }
                    methodDeclaration.Modifier |= Modifiers.Public;
                }
                methodDeclaration.Parent = typeDeclaration;

                if (IncludeParamters)
                {
                    TypeReference[] arguments = sigParser.GetArgumentTypes(method.Signature);
                    int             i         = 1;
                    foreach (TypeReference typeRef in arguments)
                    {
                        ParameterDeclarationExpression param = new ParameterDeclarationExpression(typeRef, "parameter" + i++.ToString());
                        methodDeclaration.Parameters.Add(param);
                    }
                }
                typeDeclaration.Children.Add(methodDeclaration);
            }
            foreach (ClassFile.Field field in clazz.Fields)
            {
                if (!field.IsPublic)
                {
                    continue;
                }
                TypeReference    type             = sigParser.GetFieldType(field.Signature);
                FieldDeclaration fieldDeclaration = new FieldDeclaration(null, type, Modifiers.None);
                fieldDeclaration.Fields.Add(new VariableDeclaration(field.Name));
                fieldDeclaration.Parent = typeDeclaration;
                typeDeclaration.Children.Add(fieldDeclaration);
            }
            if (clazz.Name != "java.lang.Object" && clazz.SuperClass != null && clazz.SuperClass != "java.lang.Object")
            {
                TypeReference baseType = new TypeReference(clazz.SuperClass.Replace("$", "."));
                baseType.Kind = TypeReferenceKind.Extends;
                typeDeclaration.BaseTypes.Add(baseType);
            }
            foreach (ClassFile.ConstantPoolItemClass interfaceType in clazz.Interfaces)
            {
                TypeReference interf = new TypeReference(interfaceType.Name.Replace("$", "."));
                interf.Kind = TypeReferenceKind.Implements;
                typeDeclaration.BaseTypes.Add(interf);
            }
            return(typeDeclaration);
        }