Пример #1
0
        public void GetArguments()
        {
            SignatureParser parser = new SignatureParser();

            Assert.AreEqual(0, parser.GetArgumentTypes("()I").Length);

            TypeReference[] types = parser.GetArgumentTypes("(java.lang.Object;)Z");
            Assert.AreEqual(1, types.Length);
            Assert.AreEqual("java.lang.Object", types[0].Type);

            types = parser.GetArgumentTypes("([java.lang.String;)Ljava.lang.Package;");
            Assert.AreEqual("java.lang.String", types[0].Type);
            Assert.AreEqual(new int[1], types[0].RankSpecifier);

            types = parser.GetArgumentTypes("(DD)V");
            Assert.AreEqual(2, types.Length);
            Assert.AreEqual("java.lang.Double", types[0].Type);
            Assert.AreEqual("java.lang.Double", types[1].Type);

            types = parser.GetArgumentTypes("(II[BI)V");
            Assert.AreEqual(4, types.Length);
            Assert.AreEqual("java.lang.Integer", types[0].Type);
            Assert.AreEqual("java.lang.Integer", types[1].Type);
            Assert.AreEqual("java.lang.Byte", types[2].Type);
            Assert.AreEqual(new int[1], types[2].RankSpecifier);
            Assert.AreEqual("java.lang.Integer", types[3].Type);
        }
        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);
        }