use of javax.lang.model.element.VariableElement in project auto by google.
the class OverridesTest method javacMethod.
private ExecutableElement javacMethod(ExecutableElement method) {
if (elementUtils == javacElementUtils) {
return method;
}
TypeElement containingType = MoreElements.asType(method.getEnclosingElement());
TypeElement javacContainingType = javacType(containingType);
List<ExecutableElement> candidates = new ArrayList<ExecutableElement>();
methods: for (ExecutableElement javacMethod : methodsIn(javacContainingType.getEnclosedElements())) {
if (javacMethod.getSimpleName().contentEquals(method.getSimpleName()) && javacMethod.getParameters().size() == method.getParameters().size()) {
for (int i = 0; i < method.getParameters().size(); i++) {
VariableElement parameter = method.getParameters().get(i);
VariableElement javacParameter = javacMethod.getParameters().get(i);
if (!erasedToString(parameter.asType()).equals(erasedToString(javacParameter.asType()))) {
continue methods;
}
}
candidates.add(javacMethod);
}
}
if (candidates.size() == 1) {
return candidates.get(0);
} else {
throw new IllegalStateException("Expected one javac method matching " + method + " but found " + candidates);
}
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class EnhancedForRewriter method boxLoopVariable.
private void boxLoopVariable(EnhancedForStatement node, TypeMirror expressionType, VariableElement loopVariable) {
DeclaredType iterableType = typeUtil.findSupertype(expressionType, "java.lang.Iterable");
List<? extends TypeMirror> typeArgs = iterableType.getTypeArguments();
assert typeArgs.size() == 1 && typeUtil.isBoxedType(typeArgs.get(0));
VariableElement boxVariable = GeneratedVariableElement.newLocalVar("boxed__", typeArgs.get(0), null);
node.setParameter(new SingleVariableDeclaration(boxVariable));
makeBlock(node.getBody()).addStatement(0, new VariableDeclarationStatement(loopVariable, new SimpleName(boxVariable)));
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class EnhancedForRewriter method endVisit.
@Override
public void endVisit(EnhancedForStatement node) {
Expression expression = node.getExpression();
TypeMirror expressionType = expression.getTypeMirror();
VariableElement loopVariable = node.getParameter().getVariableElement();
if (ElementUtil.hasAnnotation(loopVariable, AutoreleasePool.class)) {
makeBlock(node.getBody()).setHasAutoreleasePool(true);
}
if (TypeUtil.isArray(expressionType)) {
handleArrayIteration(node);
} else if (emitJavaIteratorLoop(loopVariable)) {
convertToJavaIteratorLoop(node);
} else if (loopVariable.asType().getKind().isPrimitive()) {
boxLoopVariable(node, expressionType, loopVariable);
} else {
VariableElement newLoopVariable = GeneratedVariableElement.mutableCopy(loopVariable).setTypeQualifiers("__strong");
node.getParameter().setVariableElement(newLoopVariable);
}
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class EnhancedForRewriter method convertToJavaIteratorLoop.
private void convertToJavaIteratorLoop(EnhancedForStatement node) {
Expression expression = node.getExpression();
TypeMirror expressionType = expression.getTypeMirror();
VariableElement loopVariable = node.getParameter().getVariableElement();
DeclaredType iterableType = typeUtil.findSupertype(expressionType, "java.lang.Iterable");
ExecutablePair iteratorMethod = typeUtil.findMethod(iterableType, "iterator");
DeclaredType iteratorType = (DeclaredType) iteratorMethod.type().getReturnType();
ExecutablePair hasNextMethod = typeUtil.findMethod(iteratorType, "hasNext");
ExecutablePair nextMethod = typeUtil.findMethod(iteratorType, "next");
assert hasNextMethod != null && nextMethod != null;
VariableElement iteratorVariable = GeneratedVariableElement.newLocalVar("iter__", iteratorType, null);
MethodInvocation iteratorInvocation = new MethodInvocation(iteratorMethod, TreeUtil.remove(expression));
VariableDeclarationStatement iteratorDecl = new VariableDeclarationStatement(iteratorVariable, iteratorInvocation);
MethodInvocation hasNextInvocation = new MethodInvocation(hasNextMethod, new SimpleName(iteratorVariable));
MethodInvocation nextInvocation = new MethodInvocation(nextMethod, new SimpleName(iteratorVariable));
Block newLoopBody = makeBlock(TreeUtil.remove(node.getBody()));
newLoopBody.addStatement(0, new VariableDeclarationStatement(loopVariable, nextInvocation));
WhileStatement whileLoop = new WhileStatement();
whileLoop.setExpression(hasNextInvocation);
whileLoop.setBody(newLoopBody);
Block block = new Block();
List<Statement> stmts = block.getStatements();
stmts.add(iteratorDecl);
stmts.add(whileLoop);
replaceLoop(node, block, whileLoop);
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class EnhancedForRewriter method handleArrayIteration.
private void handleArrayIteration(EnhancedForStatement node) {
Expression expression = node.getExpression();
ArrayType expressionType = (ArrayType) expression.getTypeMirror();
VariableElement loopVariable = node.getParameter().getVariableElement();
TypeMirror componentType = expressionType.getComponentType();
TypeElement iosArrayType = typeUtil.getIosArray(componentType);
TypeMirror bufferType = new PointerType(componentType);
VariableElement arrayVariable = GeneratedVariableElement.newLocalVar("a__", expressionType, null);
VariableElement bufferVariable = GeneratedVariableElement.newLocalVar("b__", bufferType, null).setTypeQualifiers("const*");
VariableElement endVariable = GeneratedVariableElement.newLocalVar("e__", bufferType, null).setTypeQualifiers("const*");
VariableElement bufferField = GeneratedVariableElement.newField("buffer", bufferType, iosArrayType).addModifiers(Modifier.PUBLIC);
VariableElement sizeField = GeneratedVariableElement.newField("size", typeUtil.getInt(), iosArrayType).addModifiers(Modifier.PUBLIC);
VariableDeclarationStatement arrayDecl = new VariableDeclarationStatement(arrayVariable, TreeUtil.remove(expression));
FieldAccess bufferAccess = new FieldAccess(bufferField, new SimpleName(arrayVariable));
VariableDeclarationStatement bufferDecl = new VariableDeclarationStatement(bufferVariable, bufferAccess);
InfixExpression endInit = new InfixExpression(bufferType, InfixExpression.Operator.PLUS, new SimpleName(bufferVariable), new FieldAccess(sizeField, new SimpleName(arrayVariable)));
VariableDeclarationStatement endDecl = new VariableDeclarationStatement(endVariable, endInit);
WhileStatement loop = new WhileStatement();
loop.setExpression(new InfixExpression(typeUtil.getBoolean(), InfixExpression.Operator.LESS, new SimpleName(bufferVariable), new SimpleName(endVariable)));
Block newLoopBody = makeBlock(TreeUtil.remove(node.getBody()));
loop.setBody(newLoopBody);
newLoopBody.addStatement(0, new VariableDeclarationStatement(loopVariable, new PrefixExpression(componentType, PrefixExpression.Operator.DEREFERENCE, new PostfixExpression(bufferVariable, PostfixExpression.Operator.INCREMENT))));
Block block = new Block();
List<Statement> stmts = block.getStatements();
stmts.add(arrayDecl);
stmts.add(bufferDecl);
stmts.add(endDecl);
stmts.add(loop);
replaceLoop(node, block, loop);
}
Aggregations