/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.devtools.j2objc.types; import com.google.common.base.Preconditions; import com.google.devtools.j2objc.util.ElementUtil; import java.util.Collection; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ElementVisitor; import javax.lang.model.element.Modifier; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; /** * Element class for variables and parameters created during translation. * * @author Nathan Braswell */ public class GeneratedVariableElement extends GeneratedElement implements VariableElement { private final TypeMirror type; private boolean nonnull = false; private boolean isWeak = false; private String typeQualifiers; private GeneratedVariableElement( String name, TypeMirror type, ElementKind kind, Element enclosingElement, boolean synthetic) { super(Preconditions.checkNotNull(name), checkElementKind(kind), enclosingElement, synthetic); this.type = type; } public static GeneratedVariableElement mutableCopy(VariableElement var) { return new GeneratedVariableElement( var.getSimpleName().toString(), var.asType(), var.getKind(), var.getEnclosingElement(), ElementUtil.isSynthetic(var)); } 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) { Preconditions.checkArgument( kind == ElementKind.FIELD || kind == ElementKind.LOCAL_VARIABLE || kind == ElementKind.PARAMETER); return kind; } @Override public TypeMirror asType() { return type; } @Override public <R, P> R accept(ElementVisitor<R, P> v, P p) { return v.visitVariable(this, p); } @Override public Object getConstantValue() { return null; } public boolean isNonnull() { return nonnull; } public GeneratedVariableElement setNonnull(boolean value) { nonnull = value; return this; } public boolean isWeak() { return isWeak; } public GeneratedVariableElement setIsWeak(boolean value) { isWeak = value; return this; } /** * Sets the qualifiers that should be added to the variable declaration. Use * an asterisk ('*') to delimit qualifiers that should apply to a pointer from * qualifiers that should apply to the pointee type. For example setting the * qualifier as "__strong * const" on a string array will result in a * declaration of "NSString * __strong * const". */ public GeneratedVariableElement setTypeQualifiers(String qualifiers) { typeQualifiers = qualifiers; return this; } public String getTypeQualifiers() { return typeQualifiers; } @Override public GeneratedVariableElement addAnnotationMirrors( Collection<? extends AnnotationMirror> newAnnotations) { return (GeneratedVariableElement) super.addAnnotationMirrors(newAnnotations); } @Override public GeneratedVariableElement addModifiers(Modifier... modifiers) { return (GeneratedVariableElement) super.addModifiers(modifiers); } }