Example usage for org.eclipse.jdt.core.dom QualifiedName resolveConstantExpressionValue

List of usage examples for org.eclipse.jdt.core.dom QualifiedName resolveConstantExpressionValue

Introduction

In this page you can find the example usage for org.eclipse.jdt.core.dom QualifiedName resolveConstantExpressionValue.

Prototype

public final Object resolveConstantExpressionValue() 

Source Link

Document

Resolves and returns the compile-time constant expression value as specified in JLS2 15.28, if this expression has one.

Usage

From source file:com.motorolamobility.preflighting.core.internal.utils.ProjectUtils.java

License:Apache License

private static void analizeBody(final CompilationUnit javaCompilationUnit, final Method method, Block body) {
    body.accept(new ASTVisitor() {

        @Override/*from  ww w.j  a  v a 2  s  . com*/
        public boolean visit(VariableDeclarationFragment node) {
            String varName = node.getName().getIdentifier();
            ITypeBinding typeBinding = node.resolveBinding().getType();
            String typeQualifiedName = typeBinding.getQualifiedName();
            int modifiers = typeBinding.getModifiers();
            boolean isFinal = isFinal(modifiers);
            boolean isStatic = isStatic(modifiers);
            String value = null;
            Expression initializer = node.getInitializer();
            if (initializer != null) {
                value = initializer.toString();
            }
            int lineNumber = javaCompilationUnit.getLineNumber(node.getStartPosition());

            Variable variable = new Variable();
            variable.setName(varName);
            variable.setType(typeQualifiedName);
            variable.setFinal(isFinal);
            variable.setStatic(isStatic);
            variable.setValue(value);
            variable.setLineNumber(lineNumber);

            method.addVariable(variable);

            return super.visit(node);
        }

        @Override
        public boolean visit(MethodInvocation node) {
            // Fill invoked method model.
            MethodInvocation invoked = node;
            IMethodBinding methodBinding = invoked.resolveMethodBinding();
            if (methodBinding != null) {
                IMethodBinding methodDeclaration = methodBinding.getMethodDeclaration();
                ITypeBinding declaringClass = methodDeclaration.getDeclaringClass();
                String declaringClassName = "";
                if (declaringClass != null) {
                    declaringClassName = declaringClass.getQualifiedName();
                }
                String methodSimpleName = methodBinding.getName();
                int lineNumber = javaCompilationUnit.getLineNumber(invoked.getStartPosition());
                String returnType = methodBinding.getReturnType().getQualifiedName();
                int methodModifiers = methodBinding.getModifiers();
                boolean isVirtual = isMethodVirtual(methodModifiers);
                String sourceFileFullPath = ((File) javaCompilationUnit.getProperty(JAVA_FILE_PROPERTY))
                        .getAbsolutePath();

                // Retrieve parameter types and look for R constants used
                // within method arguments
                List arguments = invoked.arguments();
                List<String> parameterTypes = new ArrayList<String>(arguments.size());
                List<String> parameterNames = new ArrayList<String>(arguments.size());
                for (Object argument : arguments) {
                    Expression argumentExpression = (Expression) argument;
                    ITypeBinding typeBinding = argumentExpression.resolveTypeBinding();
                    String parameterType = "";
                    String parameterName = "";
                    if (typeBinding != null) {
                        parameterType = typeBinding.getName();
                        parameterName = argumentExpression.toString();
                    } else {
                        continue;
                    }

                    parameterTypes.add(parameterType);
                    parameterNames.add(parameterName);
                    if (argumentExpression instanceof QualifiedName) /*
                                                                     * Can
                                                                     * be a
                                                                     * constant
                                                                     * access
                                                                     */
                    {
                        QualifiedName qualifiedName = (QualifiedName) argumentExpression;
                        String fullQualifiedName = qualifiedName.getQualifier().getFullyQualifiedName();
                        if (fullQualifiedName.startsWith("R.")) /*
                                                                 * Accessing
                                                                 * a R
                                                                 * constant
                                                                 */
                        {
                            Constant constant = new Constant();
                            constant.setSourceFileFullPath(sourceFileFullPath);
                            constant.setLine(lineNumber);
                            constant.setType(parameterType);
                            Object constantExpressionValue = qualifiedName.resolveConstantExpressionValue();
                            if (constantExpressionValue != null) {
                                String constantValueHex = constantExpressionValue.toString();
                                if (constantExpressionValue instanceof Integer) {
                                    Integer integerValue = (Integer) constantExpressionValue;
                                    constantValueHex = Integer.toHexString(integerValue);
                                }
                                constant.setValue(constantValueHex);
                                method.getInstructions().add(constant);
                            }
                        }

                    }
                }

                // Get the name of the object who owns the method being
                // called.
                Expression expression = invoked.getExpression();
                String objectName = null;
                if ((expression != null) && (expression instanceof SimpleName)) {
                    SimpleName simpleName = (SimpleName) expression;
                    objectName = simpleName.getIdentifier();
                }

                // Get the variable, if any, that received the method
                // returned value
                ASTNode parent = invoked.getParent();
                String assignedVariable = null;
                if (parent instanceof VariableDeclarationFragment) {
                    VariableDeclarationFragment variableDeclarationFragment = (VariableDeclarationFragment) parent;
                    assignedVariable = variableDeclarationFragment.getName().getIdentifier();
                } else if (parent instanceof Assignment) {
                    Assignment assignment = (Assignment) parent;
                    Expression leftHandSide = assignment.getLeftHandSide();
                    if (leftHandSide instanceof SimpleName) {
                        SimpleName name = (SimpleName) leftHandSide;
                        assignedVariable = name.getIdentifier();
                    }
                }

                // Fill Invoke object and add to the method model.
                Invoke invoke = new Invoke();
                invoke.setLine(lineNumber);
                invoke.setMethodName(methodSimpleName);
                invoke.setObjectName(objectName);
                invoke.setType(getMethodTypeString(isVirtual));
                invoke.setReturnType(returnType);
                invoke.setClassCalled(declaringClassName);
                invoke.setParameterTypes(parameterTypes);
                invoke.setParameterNames(parameterNames);
                invoke.setSourceFileFullPath(sourceFileFullPath);
                invoke.setAssignedVariable(assignedVariable);

                method.getInstructions().add(invoke);
            }
            return super.visit(node);
        }

        @Override
        public boolean visit(VariableDeclarationExpression node) {

            return super.visit(node);
        }

        @Override
        public boolean visit(Assignment node) {
            Expression lhs = node.getLeftHandSide();
            String name = "";
            if (lhs instanceof SimpleName) {
                SimpleName simpleName = (SimpleName) lhs;
                name = simpleName.getIdentifier();
            }
            ITypeBinding typeBinding = lhs.resolveTypeBinding();
            String type = typeBinding.getName();
            // method.addAssigment(assignment);

            // TODO Auto-generated method stub
            return super.visit(node);
        }
    });
}

From source file:net.sf.j2s.core.astvisitors.DependencyASTVisitor.java

License:Open Source License

public boolean visit(QualifiedName node) {
    Object constValue = node.resolveConstantExpressionValue();
    if (constValue != null && (constValue instanceof Number || constValue instanceof Character
            || constValue instanceof String || constValue instanceof Boolean) && isSimpleQualified(node)) {
        //buffer.append(constValue);
        return false;
    }//from   w  ww .j  a  va2s.c o m
    return super.visit(node);
}

From source file:org.ofbiz.plugin.analysis.Analysis.java

License:Apache License

private void analyzeOutMap(final AnalysisContext ctx, ControlFlowGraph cfg) throws FinderException {

    //TODO: if the in-map also serves as out-map then the initial keys should be available

    // get mandatory keys for out-map
    final List<String> mandatoryKeys = new ArrayList<String>();
    List<Attribute> attributes = new AttributeFinder(ctx.service).getAttributes();
    for (Attribute attr : attributes) {
        if (!attr.isOptional()
                && (attr.getMode().getLiteral().equals("OUT") || attr.getMode().getLiteral().equals("INOUT"))) {
            mandatoryKeys.add(attr.getName());
        }/* ww w  . java2 s.c om*/
    }

    if (mandatoryKeys.isEmpty())
        return; // skip analysis

    AvailableMapKeys amk = new AvailableMapKeys(cfg);
    amk.computeFixPoint();

    // find all relevant return statements in methodbody
    final List<ReturnStatement> returns = new ArrayList<ReturnStatement>();
    ctx.method.accept(new ASTVisitor() {
        @Override
        public boolean visit(ReturnStatement returnStmt) {
            Expression expr = returnStmt.getExpression();
            // basic case, e.g., return out;
            if (expr instanceof SimpleName) {
                returns.add(returnStmt);
                return false;
            }
            // special cases
            if (expr instanceof MethodInvocation) {
                MethodInvocation mi = (MethodInvocation) expr;
                IMethodBinding binding = mi.resolveMethodBinding();
                // ignore ServiceUtil.java methods
                if (binding.getDeclaringClass().getQualifiedName().equals("org.ofbiz.service.ServiceUtil")) {
                    return false;
                }
                // handle the toMap methods
                if (binding.getDeclaringClass().getQualifiedName().equals("org.ofbiz.base.util.UtilMisc")
                        && binding.getName().equals("toMap")) {
                    Set<String> keys = new HashSet<String>();
                    //TODO: handle toMap(String[])
                    for (int i = 0; i < mi.arguments().size(); i += 2) {
                        // collect keys from toMap(..)-call
                        if (mi.arguments().get(i) instanceof StringLiteral) {
                            keys.add(((StringLiteral) mi.arguments().get(i)).getLiteralValue());
                        }
                        // handle special case of service execution errors (ModelService-class)
                        if (mi.arguments().get(i) instanceof QualifiedName
                                && mi.arguments().get(i + 1) instanceof QualifiedName) {
                            QualifiedName keyQN = (QualifiedName) mi.arguments().get(i);
                            QualifiedName valueQN = (QualifiedName) mi.arguments().get(i + 1);
                            String key = keyQN.resolveConstantExpressionValue().toString();
                            String value = valueQN.resolveConstantExpressionValue().toString();
                            // service execution errors are ignored
                            if (key.equals("responseMessage")
                                    && (value.equals("error") || value.equals("fail"))) {
                                return false;
                            } else {
                                keys.add(key);
                            }
                        }
                    }

                    for (String key : mandatoryKeys) {
                        if (!keys.contains(key)) {
                            ctx.error(returnStmt, "Missing mandatory output-parameter: " + key);
                        }
                    }
                    return false;
                }
            }
            ctx.warn(returnStmt, "Unable to analyze complex returns: " + Util.getFirstLine(returnStmt));
            return false;
        }
    });

    // check key usage for each return statement
    for (ReturnStatement stmt : returns) {
        String variable = ((SimpleName) stmt.getExpression()).getIdentifier();

        // is there a statement on this path in the control flow which
        // uses the out-map as a parameter? e.g., doSomething( out );

        if (amk.isNameUsedInInterproceduralCall(variable)) {
            for (Statement s : amk.getInterproceduralCalls(variable)) {
                ctx.warn(s, "Unable to analyze interprocedural calls");
            }

        } else {

            // regular analysis

            Set<Pair<String, String>> outSet = amk.getOutSet(stmt);
            for (String key : mandatoryKeys) {
                if (!outSet.contains(new Pair<String, String>(variable, key))) {
                    if (outSet.contains(new Pair<String, String>(variable, "responseMessage"))
                            || outSet.contains(new Pair<String, String>(variable, "errorMessage"))) {
                        // might be the special case of service execution error (ModelService-class)
                        ctx.warn(stmt, "Might be missing mandatory output parameter: " + key);
                    } else {
                        ctx.error(stmt, "Missing mandatory output-parameter: " + key);
                    }
                }
            }
        }

    }
}

From source file:org.ofbiz.plugin.analysis.AvailableMapKeys.java

License:Apache License

/** returns a pair (map x key) from a java.util.Map.put()-operation */
private Pair<String, String> getPutOperation(MethodInvocation mi) {
    Expression expr = mi.getExpression();
    if (expr == null)
        return null;
    ITypeBinding binding = expr.resolveTypeBinding();
    if ("java.util.Map".equals(binding.getQualifiedName()) && "put".equals(mi.getName().getIdentifier())) {

        if (!(expr instanceof SimpleName)) {
            // special case, screensAtt.getContext().put("formStringRenderer", foFormRenderer);
            return null;
        }/*from   www  . j a v a 2  s.c  om*/

        SimpleName variable = (SimpleName) expr;
        Object key = mi.arguments().get(0);

        // ordinary strings
        if (key instanceof StringLiteral) {
            String keyContent = key.toString().replace("\"", "");
            return new Pair<String, String>(variable.getIdentifier(), keyContent);
            // constants
        } else if (key instanceof QualifiedName) {
            QualifiedName name = (QualifiedName) key;
            Object obj = name.resolveConstantExpressionValue();
            if (obj != null && obj instanceof String) {
                return new Pair<String, String>(variable.getIdentifier(), obj.toString());
            }
        }
    }
    return null;
}