/
GeneratedVariableElement.java
125 lines (106 loc) · 4.13 KB
/
GeneratedVariableElement.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* 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 String typeQualifiers;
public static GeneratedVariableElement asMutable(VariableElement var) {
return var instanceof GeneratedVariableElement
? (GeneratedVariableElement) var
: new GeneratedVariableElement(var.getSimpleName().toString(), var.asType(),
var.getKind(), var.getEnclosingElement(), ElementUtil.isSynthetic(var));
}
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 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;
}
/**
* 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);
}
}