Skip to content

Commit

Permalink
Adds factory methods for GeneratedVariableElement so that the Element…
Browse files Browse the repository at this point in the history
…Kind doesn't have to be specified as a parameter.

	Change on 2016/10/25 by kstanger <kstanger@google.com>

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137146819
  • Loading branch information
kstanger authored and tomball committed Nov 4, 2016
1 parent 384a940 commit f030278
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 56 deletions.
Expand Up @@ -100,9 +100,8 @@ public Element getEnclosingElement() {
// This comes up when an anonymous class is initializing a member outside of a constructor. // This comes up when an anonymous class is initializing a member outside of a constructor.
// The enclosing element should be the field it's being assigned to, but the binding doesn't // The enclosing element should be the field it's being assigned to, but the binding doesn't
// give us this information, so we have to fake it. // give us this information, so we have to fake it.
return new GeneratedVariableElement( return GeneratedVariableElement.newField(
"fake_field", this.asType(), ElementKind.FIELD, "fake_field", this.asType(), BindingConverter.getElement(decl.getDeclaringClass()));
BindingConverter.getElement(decl.getDeclaringClass()));
} else { } else {
return BindingConverter.getElement(decl.getDeclaringClass()); return BindingConverter.getElement(decl.getDeclaringClass());
} }
Expand Down
Expand Up @@ -179,8 +179,8 @@ private MethodDeclaration newReturnTypeNarrowingDeclaration(
} }
int argCount = 0; int argCount = 0;
for (TypeMirror paramType : method.type().getParameterTypes()) { for (TypeMirror paramType : method.type().getParameterTypes()) {
VariableElement param = new GeneratedVariableElement( VariableElement param = GeneratedVariableElement.newParameter(
"arg" + argCount++, paramType, ElementKind.PARAMETER, element); "arg" + argCount++, paramType, element);
element.addParameter(param); element.addParameter(param);
decl.addParameter(new SingleVariableDeclaration(param)); decl.addParameter(new SingleVariableDeclaration(param));
} }
Expand Down
Expand Up @@ -33,7 +33,6 @@
import com.google.devtools.j2objc.types.GeneratedVariableElement; import com.google.devtools.j2objc.types.GeneratedVariableElement;
import com.google.devtools.j2objc.util.ElementUtil; import com.google.devtools.j2objc.util.ElementUtil;
import com.google.devtools.j2objc.util.TypeUtil; import com.google.devtools.j2objc.util.TypeUtil;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement; import javax.lang.model.element.VariableElement;
Expand Down Expand Up @@ -108,8 +107,8 @@ private void addDefaultConstructor(TypeDeclaration node, ExecutableElement const
// constructor and passed to the super call. // constructor and passed to the super call.
int argCount = 0; int argCount = 0;
for (VariableElement param : constructorElement.getParameters()) { for (VariableElement param : constructorElement.getParameters()) {
GeneratedVariableElement newParam = new GeneratedVariableElement( GeneratedVariableElement newParam = GeneratedVariableElement.newParameter(
"arg$" + argCount++, param.asType(), ElementKind.PARAMETER, constructorElement); "arg$" + argCount++, param.asType(), constructorElement);
constructor.addParameter(new SingleVariableDeclaration(newParam)); constructor.addParameter(new SingleVariableDeclaration(newParam));
superCall.addArgument(new SimpleName(newParam)); superCall.addArgument(new SimpleName(newParam));
} }
Expand Down
Expand Up @@ -44,7 +44,6 @@
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
Expand Down Expand Up @@ -182,7 +181,7 @@ private boolean takesPrecedence(ExecutablePair a, ExecutablePair b) {


private void addShimWithInvocation( private void addShimWithInvocation(
String selector, ExecutablePair method, Expression invocation, List<Expression> args) { String selector, ExecutablePair method, Expression invocation, List<Expression> args) {
ExecutableElement element = GeneratedExecutableElement.newMethodWithSelector( GeneratedExecutableElement element = GeneratedExecutableElement.newMethodWithSelector(
selector, method.type().getReturnType(), typeElem) selector, method.type().getReturnType(), typeElem)
.addModifiers(method.element().getModifiers()) .addModifiers(method.element().getModifiers())
.removeModifiers(Modifier.ABSTRACT, Modifier.DEFAULT); .removeModifiers(Modifier.ABSTRACT, Modifier.DEFAULT);
Expand All @@ -192,8 +191,9 @@ private void addShimWithInvocation(


int i = 0; int i = 0;
for (TypeMirror paramType : method.type().getParameterTypes()) { for (TypeMirror paramType : method.type().getParameterTypes()) {
GeneratedVariableElement newParam = new GeneratedVariableElement( GeneratedVariableElement newParam = GeneratedVariableElement.newParameter(
"arg" + i++, paramType, ElementKind.PARAMETER, null); "arg" + i++, paramType, element);
element.addParameter(newParam);
methodDecl.addParameter(new SingleVariableDeclaration(newParam)); methodDecl.addParameter(new SingleVariableDeclaration(newParam));
args.add(new SimpleName(newParam)); args.add(new SimpleName(newParam));
} }
Expand Down
Expand Up @@ -41,7 +41,6 @@
import com.google.j2objc.annotations.LoopTranslation.LoopStyle; import com.google.j2objc.annotations.LoopTranslation.LoopStyle;
import java.util.List; import java.util.List;
import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement; import javax.lang.model.element.VariableElement;
Expand Down Expand Up @@ -91,19 +90,17 @@ private void handleArrayIteration(EnhancedForStatement node) {
TypeMirror componentType = expressionType.getComponentType(); TypeMirror componentType = expressionType.getComponentType();
TypeElement iosArrayType = typeEnv.resolveArrayType(componentType); TypeElement iosArrayType = typeEnv.resolveArrayType(componentType);
TypeMirror bufferType = new PointerType(componentType); TypeMirror bufferType = new PointerType(componentType);
VariableElement arrayVariable = new GeneratedVariableElement( VariableElement arrayVariable = GeneratedVariableElement.newLocalVar(
"a__", expressionType, ElementKind.LOCAL_VARIABLE, null); "a__", expressionType, null);
VariableElement bufferVariable = new GeneratedVariableElement( VariableElement bufferVariable = GeneratedVariableElement.newLocalVar("b__", bufferType, null)
"b__", bufferType, ElementKind.LOCAL_VARIABLE, null)
.setTypeQualifiers("const*"); .setTypeQualifiers("const*");
VariableElement endVariable = new GeneratedVariableElement( VariableElement endVariable = GeneratedVariableElement.newLocalVar("e__", bufferType, null)
"e__", bufferType, ElementKind.LOCAL_VARIABLE, null)
.setTypeQualifiers("const*"); .setTypeQualifiers("const*");
VariableElement bufferField = new GeneratedVariableElement( VariableElement bufferField = GeneratedVariableElement.newField(
"buffer", bufferType, ElementKind.FIELD, iosArrayType) "buffer", bufferType, iosArrayType)
.addModifiers(Modifier.PUBLIC); .addModifiers(Modifier.PUBLIC);
VariableElement sizeField = new GeneratedVariableElement( VariableElement sizeField = GeneratedVariableElement.newField(
"size", typeUtil.getPrimitiveType(TypeKind.INT), ElementKind.FIELD, iosArrayType) "size", typeUtil.getPrimitiveType(TypeKind.INT), iosArrayType)
.addModifiers(Modifier.PUBLIC); .addModifiers(Modifier.PUBLIC);


VariableDeclarationStatement arrayDecl = VariableDeclarationStatement arrayDecl =
Expand Down Expand Up @@ -161,8 +158,8 @@ private void convertToJavaIteratorLoop(EnhancedForStatement node) {
ExecutablePair nextMethod = typeUtil.findMethod(iteratorType, "next"); ExecutablePair nextMethod = typeUtil.findMethod(iteratorType, "next");
assert hasNextMethod != null && nextMethod != null; assert hasNextMethod != null && nextMethod != null;


VariableElement iteratorVariable = new GeneratedVariableElement( VariableElement iteratorVariable = GeneratedVariableElement.newLocalVar(
"iter__", iteratorType, ElementKind.LOCAL_VARIABLE, null); "iter__", iteratorType, null);


MethodInvocation iteratorInvocation = MethodInvocation iteratorInvocation =
new MethodInvocation(iteratorMethod, TreeUtil.remove(expression)); new MethodInvocation(iteratorMethod, TreeUtil.remove(expression));
Expand Down Expand Up @@ -204,8 +201,8 @@ private void boxLoopVariable(
DeclaredType iterableType = typeUtil.findSupertype(expressionType, "java.lang.Iterable"); DeclaredType iterableType = typeUtil.findSupertype(expressionType, "java.lang.Iterable");
List<? extends TypeMirror> typeArgs = iterableType.getTypeArguments(); List<? extends TypeMirror> typeArgs = iterableType.getTypeArguments();
assert typeArgs.size() == 1 && typeUtil.isBoxedType(typeArgs.get(0)); assert typeArgs.size() == 1 && typeUtil.isBoxedType(typeArgs.get(0));
VariableElement boxVariable = new GeneratedVariableElement( VariableElement boxVariable = GeneratedVariableElement.newLocalVar(
"boxed__", typeArgs.get(0), ElementKind.LOCAL_VARIABLE, null); "boxed__", typeArgs.get(0), null);
node.setParameter(new SingleVariableDeclaration(boxVariable)); node.setParameter(new SingleVariableDeclaration(boxVariable));
makeBlock(node.getBody()).addStatement( makeBlock(node.getBody()).addStatement(
0, new VariableDeclarationStatement(loopVariable, new SimpleName(boxVariable))); 0, new VariableDeclarationStatement(loopVariable, new SimpleName(boxVariable)));
Expand Down
Expand Up @@ -58,7 +58,6 @@
import com.google.j2objc.annotations.ObjectiveCName; import com.google.j2objc.annotations.ObjectiveCName;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror; import javax.lang.model.type.TypeMirror;
Expand Down Expand Up @@ -153,8 +152,7 @@ private void addSimpleNonArcInitialization(EnumDeclaration node) {


TypeMirror intType = typeEnv.resolveJavaTypeMirror("int"); TypeMirror intType = typeEnv.resolveJavaTypeMirror("int");
GeneratedVariableElement loopCounterElement = GeneratedVariableElement loopCounterElement =
new GeneratedVariableElement("i", intType, GeneratedVariableElement.newLocalVar("i", intType, TreeUtil.getEnclosingElement(node));
ElementKind.LOCAL_VARIABLE, TreeUtil.getEnclosingElement(node));
VariableDeclarationExpression loopCounter = VariableDeclarationExpression loopCounter =
new VariableDeclarationExpression().setType(Type.newType(loopCounterElement.asType())) new VariableDeclarationExpression().setType(Type.newType(loopCounterElement.asType()))
.addFragment(new VariableDeclarationFragment( .addFragment(new VariableDeclarationFragment(
Expand Down
Expand Up @@ -151,8 +151,8 @@ private void replaceNode() {
node.replaceWith(creation); node.replaceWith(creation);
} else { } else {
// For non-capturing lambdas, create a static final instance. // For non-capturing lambdas, create a static final instance.
VariableElement instanceVar = new GeneratedVariableElement( VariableElement instanceVar = GeneratedVariableElement.newField(
"instance", lambdaType.asType(), ElementKind.FIELD, lambdaType) "instance", lambdaType.asType(), lambdaType)
.addModifiers(Modifier.STATIC, Modifier.FINAL); .addModifiers(Modifier.STATIC, Modifier.FINAL);
typeDecl.addBodyDeclaration(new FieldDeclaration(instanceVar, creation)); typeDecl.addBodyDeclaration(new FieldDeclaration(instanceVar, creation));
node.replaceWith(new SimpleName(instanceVar)); node.replaceWith(new SimpleName(instanceVar));
Expand Down Expand Up @@ -188,8 +188,8 @@ private Iterator<VariableElement> createParameters() {
List<VariableElement> params = new ArrayList<>(paramTypes.size()); List<VariableElement> params = new ArrayList<>(paramTypes.size());
int i = 0; int i = 0;
for (TypeMirror type : paramTypes) { for (TypeMirror type : paramTypes) {
GeneratedVariableElement param = new GeneratedVariableElement( GeneratedVariableElement param = GeneratedVariableElement.newParameter(
getParamName(i++), type, ElementKind.PARAMETER, null); getParamName(i++), type, implElement);
params.add(param); params.add(param);
implElement.addParameter(param); implElement.addParameter(param);
implDecl.addParameter(new SingleVariableDeclaration(param)); implDecl.addParameter(new SingleVariableDeclaration(param));
Expand Down
Expand Up @@ -114,8 +114,7 @@ public void addParametersPlaceholderFront(List<TypeMirror> types) {
} }


public void addParameterPlaceholderFront(TypeMirror type) { public void addParameterPlaceholderFront(TypeMirror type) {
parameters.add(0, new GeneratedVariableElement( parameters.add(0, GeneratedVariableElement.newParameter("placeholder", type, this));
"placeholder", type, ElementKind.PARAMETER, null));
} }


@Override @Override
Expand Down
Expand Up @@ -43,17 +43,28 @@ public static GeneratedVariableElement asMutable(VariableElement var) {
var.getKind(), var.getEnclosingElement(), ElementUtil.isSynthetic(var)); var.getKind(), var.getEnclosingElement(), ElementUtil.isSynthetic(var));
} }


public GeneratedVariableElement(
String name, TypeMirror type, ElementKind kind, Element enclosingElement) {
this(name, type, kind, enclosingElement, true);
}

private GeneratedVariableElement( private GeneratedVariableElement(
String name, TypeMirror type, ElementKind kind, Element enclosingElement, boolean synthetic) { String name, TypeMirror type, ElementKind kind, Element enclosingElement, boolean synthetic) {
super(Preconditions.checkNotNull(name), checkElementKind(kind), enclosingElement, synthetic); super(Preconditions.checkNotNull(name), checkElementKind(kind), enclosingElement, synthetic);
this.type = type; this.type = type;
} }


public static GeneratedVariableElement newField(
String name, TypeMirror type, Element enclosingElement) {
return new GeneratedVariableElement(name, type, ElementKind.FIELD, enclosingElement, true);
}

public static GeneratedVariableElement newParameter(
String name, TypeMirror type, Element enclosingElement) {
return new GeneratedVariableElement(name, type, ElementKind.PARAMETER, enclosingElement, true);
}

public static GeneratedVariableElement newLocalVar(
String name, TypeMirror type, Element enclosingElement) {
return new GeneratedVariableElement(
name, type, ElementKind.LOCAL_VARIABLE, enclosingElement, true);
}

private static ElementKind checkElementKind(ElementKind kind) { private static ElementKind checkElementKind(ElementKind kind) {
Preconditions.checkArgument( Preconditions.checkArgument(
kind == ElementKind.FIELD || kind == ElementKind.LOCAL_VARIABLE kind == ElementKind.FIELD || kind == ElementKind.LOCAL_VARIABLE
Expand Down
Expand Up @@ -22,7 +22,6 @@
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier; import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement; import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement; import javax.lang.model.element.VariableElement;
Expand Down Expand Up @@ -150,8 +149,7 @@ private String getCaptureFieldName(VariableElement var, TypeElement type) {
public VariableElement getOrCreateOuterParam(TypeElement type) { public VariableElement getOrCreateOuterParam(TypeElement type) {
VariableElement outerParam = outerParams.get(type); VariableElement outerParam = outerParams.get(type);
if (outerParam == null) { if (outerParam == null) {
outerParam = new GeneratedVariableElement( outerParam = GeneratedVariableElement.newParameter("outer$", getDeclaringType(type), type)
"outer$", getDeclaringType(type), ElementKind.PARAMETER, type)
.setNonnull(true); .setNonnull(true);
outerParams.put(type, outerParam); outerParams.put(type, outerParam);
} }
Expand All @@ -163,8 +161,8 @@ public VariableElement getOrCreateOuterField(TypeElement type) {
getOrCreateOuterParam(type); getOrCreateOuterParam(type);
VariableElement outerField = outerFields.get(type); VariableElement outerField = outerFields.get(type);
if (outerField == null) { if (outerField == null) {
outerField = new GeneratedVariableElement( outerField = GeneratedVariableElement.newField(
getOuterFieldName(type), getDeclaringType(type), ElementKind.FIELD, type) getOuterFieldName(type), getDeclaringType(type), type)
.addModifiers(Modifier.PRIVATE, Modifier.FINAL) .addModifiers(Modifier.PRIVATE, Modifier.FINAL)
.setNonnull(true); .setNonnull(true);
outerFields.put(type, outerField); outerFields.put(type, outerField);
Expand All @@ -179,8 +177,8 @@ private LocalCapture getOrCreateLocalCapture(VariableElement var, TypeElement de
return localCapture; return localCapture;
} }
} }
LocalCapture newCapture = new LocalCapture(var, new GeneratedVariableElement( LocalCapture newCapture = new LocalCapture(var, GeneratedVariableElement.newParameter(
"capture$" + capturesForType.size(), var.asType(), ElementKind.PARAMETER, declaringType)); "capture$" + capturesForType.size(), var.asType(), declaringType));
capturesForType.add(newCapture); capturesForType.add(newCapture);
return newCapture; return newCapture;
} }
Expand All @@ -192,8 +190,8 @@ public VariableElement getOrCreateCaptureParam(VariableElement var, TypeElement
public VariableElement getOrCreateCaptureField(VariableElement var, TypeElement declaringType) { public VariableElement getOrCreateCaptureField(VariableElement var, TypeElement declaringType) {
LocalCapture capture = getOrCreateLocalCapture(var, declaringType); LocalCapture capture = getOrCreateLocalCapture(var, declaringType);
if (capture.field == null) { if (capture.field == null) {
capture.field = new GeneratedVariableElement( capture.field = GeneratedVariableElement.newField(
getCaptureFieldName(var, declaringType), var.asType(), ElementKind.FIELD, declaringType) getCaptureFieldName(var, declaringType), var.asType(), declaringType)
.addModifiers(Modifier.PRIVATE, Modifier.FINAL) .addModifiers(Modifier.PRIVATE, Modifier.FINAL)
.addAnnotationMirrors(var.getAnnotationMirrors()); .addAnnotationMirrors(var.getAnnotationMirrors());
} }
Expand All @@ -202,8 +200,8 @@ public VariableElement getOrCreateCaptureField(VariableElement var, TypeElement


public VariableElement createSuperOuterParam(TypeElement type, TypeMirror superOuterType) { public VariableElement createSuperOuterParam(TypeElement type, TypeMirror superOuterType) {
assert !superOuterParams.containsKey(type); assert !superOuterParams.containsKey(type);
VariableElement param = new GeneratedVariableElement( VariableElement param = GeneratedVariableElement.newParameter(
"superOuter$", superOuterType, ElementKind.PARAMETER, type) "superOuter$", superOuterType, type)
.setNonnull(true); .setNonnull(true);
superOuterParams.put(type, param); superOuterParams.put(type, param);
return param; return param;
Expand All @@ -212,11 +210,9 @@ public VariableElement createSuperOuterParam(TypeElement type, TypeMirror superO
public void addMethodReferenceReceiver(TypeElement type, TypeMirror receiverType) { public void addMethodReferenceReceiver(TypeElement type, TypeMirror receiverType) {
assert !outerParams.containsKey(type) && !outerFields.containsKey(type); assert !outerParams.containsKey(type) && !outerFields.containsKey(type);
// Add the target field as an outer field even though it's not really pointing to outer scope. // Add the target field as an outer field even though it's not really pointing to outer scope.
outerParams.put(type, new GeneratedVariableElement( outerParams.put(type, GeneratedVariableElement.newParameter("outer$", receiverType, type)
"outer$", receiverType, ElementKind.PARAMETER, type)
.setNonnull(true)); .setNonnull(true));
outerFields.put(type, new GeneratedVariableElement( outerFields.put(type, GeneratedVariableElement.newField("target$", receiverType, type)
"target$", receiverType, ElementKind.FIELD, type)
.addModifiers(Modifier.PRIVATE, Modifier.FINAL) .addModifiers(Modifier.PRIVATE, Modifier.FINAL)
.setNonnull(true)); .setNonnull(true));
} }
Expand Down

0 comments on commit f030278

Please sign in to comment.