use of javax.lang.model.element.VariableElement in project j2objc by google.
the class OperatorRewriter method getRetainedWithTarget.
// Gets the target object for a call to the RetainedWith wrapper.
private Expression getRetainedWithTarget(Assignment node, VariableElement var) {
Expression lhs = node.getLeftHandSide();
if (!(lhs instanceof FieldAccess)) {
return new ThisExpression(ElementUtil.getDeclaringClass(var).asType());
}
// To avoid duplicating the target expression we must save the result to a local variable.
FieldAccess fieldAccess = (FieldAccess) lhs;
Expression target = fieldAccess.getExpression();
VariableElement targetVar = GeneratedVariableElement.newLocalVar("__rw$" + rwCount++, target.getTypeMirror(), null);
TreeUtil.asStatementList(TreeUtil.getOwningStatement(lhs)).add(0, new VariableDeclarationStatement(targetVar, null));
fieldAccess.setExpression(new SimpleName(targetVar));
CommaExpression commaExpr = new CommaExpression(new Assignment(new SimpleName(targetVar), target));
node.replaceWith(commaExpr);
commaExpr.addExpression(node);
return new SimpleName(targetVar);
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class OperatorRewriter method rewriteRegularAssignment.
private void rewriteRegularAssignment(Assignment node) {
VariableElement var = TreeUtil.getVariableElement(node.getLeftHandSide());
if (var == null) {
return;
}
handleRetainedLocal(var, node.getRightHandSide());
boolean isRetainedWith = ElementUtil.isRetainedWithField(var);
String funcName = getAssignmentFunctionName(node, var, isRetainedWith);
if (funcName == null) {
return;
}
TypeMirror type = node.getTypeMirror();
TypeMirror idType = TypeUtil.ID_TYPE;
TypeMirror declaredType = type.getKind().isPrimitive() ? type : idType;
Expression lhs = node.getLeftHandSide();
FunctionElement element = new FunctionElement(funcName, declaredType, null);
FunctionInvocation invocation = new FunctionInvocation(element, type);
List<Expression> args = invocation.getArguments();
if (isRetainedWith) {
element.addParameters(idType);
args.add(getRetainedWithTarget(node, var));
}
element.addParameters(TypeUtil.ID_PTR_TYPE, idType);
args.add(new PrefixExpression(new PointerType(lhs.getTypeMirror()), PrefixExpression.Operator.ADDRESS_OF, TreeUtil.remove(lhs)));
args.add(TreeUtil.remove(node.getRightHandSide()));
node.replaceWith(invocation);
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class OuterReferenceResolver method visit.
@Override
public boolean visit(SuperFieldAccess node) {
VariableElement var = node.getVariableElement();
Name path = getPathForField(var, node.getTypeMirror());
if (path != null) {
node.replaceWith(path);
}
return false;
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class JavaCloneWriter method endVisit.
@Override
public void endVisit(TypeDeclaration node) {
TypeElement type = node.getTypeElement();
VariableElement originalVar = GeneratedVariableElement.newParameter("original", type.asType(), null);
List<Statement> adjustments = getFieldAdjustments(node, originalVar);
if (adjustments.isEmpty()) {
return;
}
TypeMirror voidType = typeUtil.getVoid();
ExecutableElement javaCloneElement = GeneratedExecutableElement.newMethodWithSelector(JAVA_CLONE_METHOD, voidType, type).addParameter(originalVar);
MethodDeclaration declaration = new MethodDeclaration(javaCloneElement);
declaration.setHasDeclaration(false);
node.addBodyDeclaration(declaration);
declaration.addParameter(new SingleVariableDeclaration(originalVar));
Block body = new Block();
declaration.setBody(body);
List<Statement> statements = body.getStatements();
ExecutableElement javaCloneSuperElement = GeneratedExecutableElement.newMethodWithSelector(JAVA_CLONE_METHOD, voidType, typeUtil.getJavaObject());
SuperMethodInvocation superCall = new SuperMethodInvocation(new ExecutablePair(javaCloneSuperElement));
superCall.addArgument(new SimpleName(originalVar));
statements.add(new ExpressionStatement(superCall));
statements.addAll(adjustments);
}
use of javax.lang.model.element.VariableElement in project j2objc by google.
the class JavaCloneWriter method getFieldAdjustments.
private List<Statement> getFieldAdjustments(TypeDeclaration node, VariableElement originalVar) {
List<Statement> adjustments = Lists.newArrayList();
for (VariableDeclarationFragment decl : TreeUtil.getAllFields(node)) {
VariableElement var = decl.getVariableElement();
if (ElementUtil.isStatic(var) || var.asType().getKind().isPrimitive()) {
continue;
}
boolean isWeak = ElementUtil.isWeakReference(var);
boolean isVolatile = ElementUtil.isVolatile(var);
if (isVolatile) {
adjustments.add(createVolatileCloneStatement(var, originalVar, isWeak));
} else if (isWeak) {
adjustments.add(createReleaseStatement(var));
}
}
return adjustments;
}
Aggregations