Lines 82-87
import javax.lang.model.type.TypeKind;
Link Here
|
82 |
import javax.lang.model.type.TypeKind; |
82 |
import javax.lang.model.type.TypeKind; |
83 |
import javax.lang.model.type.TypeMirror; |
83 |
import javax.lang.model.type.TypeMirror; |
84 |
import javax.lang.model.type.TypeVariable; |
84 |
import javax.lang.model.type.TypeVariable; |
|
|
85 |
import javax.lang.model.util.Types; |
85 |
import javax.swing.text.Document; |
86 |
import javax.swing.text.Document; |
86 |
|
87 |
|
87 |
import org.netbeans.api.java.lexer.JavaTokenId; |
88 |
import org.netbeans.api.java.lexer.JavaTokenId; |
Lines 242-247
public final class GeneratorUtilities {
Link Here
|
242 |
return createMethod(method, (DeclaredType)clazz.asType()); |
243 |
return createMethod(method, (DeclaredType)clazz.asType()); |
243 |
} |
244 |
} |
244 |
|
245 |
|
|
|
246 |
/**Create a new method tree for the given method element. The method will be created as if it were member of {@link asMemberOf} type |
247 |
* (see also {@link Types#asMemberOf(javax.lang.model.type.DeclaredType,javax.lang.model.element.Element)}). |
248 |
* The new method will have an empty body. |
249 |
* |
250 |
* @param asMemberOf create the method as if it were member of this type |
251 |
* @param method method to create |
252 |
* @return a newly created method |
253 |
* @see Types#asMemberOf(javax.lang.model.type.DeclaredType,javax.lang.model.element.Element) |
254 |
* @since 0.34 |
255 |
*/ |
256 |
public MethodTree createMethod(DeclaredType asMemberOf, ExecutableElement method) { |
257 |
TreeMaker make = copy.getTreeMaker(); |
258 |
Set<Modifier> mods = method.getModifiers(); |
259 |
Set<Modifier> flags = mods.isEmpty() ? EnumSet.noneOf(Modifier.class) : EnumSet.copyOf(mods); |
260 |
flags.remove(Modifier.ABSTRACT); |
261 |
flags.remove(Modifier.NATIVE); |
262 |
|
263 |
ExecutableType et = (ExecutableType) method.asType(); |
264 |
try { |
265 |
et = (ExecutableType) copy.getTypes().asMemberOf(asMemberOf, method); |
266 |
} catch (IllegalArgumentException iae) { |
267 |
} |
268 |
List<TypeParameterTree> typeParams = new ArrayList<TypeParameterTree>(); |
269 |
for (TypeVariable typeVariable : et.getTypeVariables()) { |
270 |
List<ExpressionTree> bounds = new ArrayList<ExpressionTree>(); |
271 |
TypeMirror bound = typeVariable.getUpperBound(); |
272 |
if (bound.getKind() != TypeKind.NULL) { |
273 |
if (bound.getKind() == TypeKind.DECLARED) { |
274 |
ClassSymbol boundSymbol = (ClassSymbol) ((DeclaredType) bound).asElement(); |
275 |
if (boundSymbol.getSimpleName().length() == 0 && (boundSymbol.flags() & Flags.COMPOUND) != 0) { |
276 |
bounds.add((ExpressionTree) make.Type(boundSymbol.getSuperclass())); |
277 |
for (Type iface : boundSymbol.getInterfaces()) { |
278 |
bounds.add((ExpressionTree) make.Type(iface)); |
279 |
} |
280 |
} else if (!boundSymbol.getQualifiedName().contentEquals("java.lang.Object")) { //NOI18N |
281 |
//if the bound is java.lang.Object, do not generate the extends clause: |
282 |
|
283 |
bounds.add((ExpressionTree) make.Type(bound)); |
284 |
} |
285 |
} else { |
286 |
bounds.add((ExpressionTree) make.Type(bound)); |
287 |
} |
288 |
} |
289 |
typeParams.add(make.TypeParameter(typeVariable.asElement().getSimpleName(), bounds)); |
290 |
} |
291 |
|
292 |
Tree returnType = make.Type(et.getReturnType()); |
293 |
|
294 |
List<VariableTree> params = new ArrayList<VariableTree>(); |
295 |
boolean isVarArgs = method.isVarArgs(); |
296 |
Iterator<? extends VariableElement> formArgNames = method.getParameters().iterator(); |
297 |
Iterator<? extends TypeMirror> formArgTypes = et.getParameterTypes().iterator(); |
298 |
ModifiersTree parameterModifiers = make.Modifiers(EnumSet.noneOf(Modifier.class)); |
299 |
while (formArgNames.hasNext() && formArgTypes.hasNext()) { |
300 |
VariableElement formArgName = formArgNames.next(); |
301 |
TypeMirror formArgType = formArgTypes.next(); |
302 |
if (isVarArgs && !formArgNames.hasNext()) { |
303 |
parameterModifiers = make.Modifiers(1L << 34, |
304 |
Collections.<AnnotationTree>emptyList()); |
305 |
} |
306 |
params.add(make.Variable(parameterModifiers, formArgName.getSimpleName(), make.Type(formArgType), null)); |
307 |
} |
308 |
|
309 |
List<ExpressionTree> throwsList = new ArrayList<ExpressionTree>(); |
310 |
for (TypeMirror tm : et.getThrownTypes()) { |
311 |
throwsList.add((ExpressionTree) make.Type(tm)); |
312 |
} |
313 |
|
314 |
ModifiersTree mt = make.Modifiers(flags, Collections.<AnnotationTree>emptyList()); |
315 |
|
316 |
return make.Method(mt, method.getSimpleName(), returnType, typeParams, params, throwsList, "{}", null); |
317 |
} |
318 |
|
245 |
/** |
319 |
/** |
246 |
* Creates a class constructor. |
320 |
* Creates a class constructor. |
247 |
* |
321 |
* |
Lines 428-487
public final class GeneratorUtilities {
Link Here
|
428 |
|
502 |
|
429 |
private MethodTree createMethod(ExecutableElement element, DeclaredType type) { |
503 |
private MethodTree createMethod(ExecutableElement element, DeclaredType type) { |
430 |
TreeMaker make = copy.getTreeMaker(); |
504 |
TreeMaker make = copy.getTreeMaker(); |
431 |
Set<Modifier> mods = element.getModifiers(); |
505 |
boolean isAbstract = element.getModifiers().contains(Modifier.ABSTRACT); |
432 |
Set<Modifier> flags = mods.isEmpty() ? EnumSet.noneOf(Modifier.class) : EnumSet.copyOf(mods); |
|
|
433 |
boolean isAbstract = flags.remove(Modifier.ABSTRACT); |
434 |
flags.remove(Modifier.NATIVE); |
435 |
|
436 |
ExecutableType et = (ExecutableType)element.asType(); |
437 |
try { |
438 |
et = (ExecutableType)copy.getTypes().asMemberOf(type, element); |
439 |
} catch (IllegalArgumentException iae) {} |
440 |
List<TypeParameterTree> typeParams = new ArrayList<TypeParameterTree>(); |
441 |
for (TypeVariable typeVariable : et.getTypeVariables()) { |
442 |
List<ExpressionTree> bounds = new ArrayList<ExpressionTree>(); |
443 |
TypeMirror bound = typeVariable.getUpperBound(); |
444 |
if (bound.getKind() != TypeKind.NULL) { |
445 |
if (bound.getKind() == TypeKind.DECLARED) { |
446 |
ClassSymbol boundSymbol = (ClassSymbol)((DeclaredType)bound).asElement(); |
447 |
if (boundSymbol.getSimpleName().length() == 0 && (boundSymbol.flags() & Flags.COMPOUND) != 0) { |
448 |
bounds.add((ExpressionTree)make.Type(boundSymbol.getSuperclass())); |
449 |
for (Type iface : boundSymbol.getInterfaces()) { |
450 |
bounds.add((ExpressionTree)make.Type(iface)); |
451 |
} |
452 |
} else if (!boundSymbol.getQualifiedName().contentEquals("java.lang.Object")) { //NOI18N |
453 |
//if the bound is java.lang.Object, do not generate the extends clause: |
454 |
bounds.add((ExpressionTree)make.Type(bound)); |
455 |
} |
456 |
} else { |
457 |
bounds.add((ExpressionTree)make.Type(bound)); |
458 |
} |
459 |
} |
460 |
typeParams.add(make.TypeParameter(typeVariable.asElement().getSimpleName(), bounds)); |
461 |
} |
462 |
|
463 |
Tree returnType = make.Type(et.getReturnType()); |
464 |
|
465 |
List<VariableTree> params = new ArrayList<VariableTree>(); |
466 |
boolean isVarArgs = element.isVarArgs(); |
467 |
Iterator<? extends VariableElement> formArgNames = element.getParameters().iterator(); |
468 |
Iterator<? extends TypeMirror> formArgTypes = et.getParameterTypes().iterator(); |
469 |
ModifiersTree parameterModifiers = make.Modifiers(EnumSet.noneOf(Modifier.class)); |
470 |
while (formArgNames.hasNext() && formArgTypes.hasNext()) { |
471 |
VariableElement formArgName = formArgNames.next(); |
472 |
TypeMirror formArgType = formArgTypes.next(); |
473 |
if (isVarArgs && !formArgNames.hasNext()) |
474 |
parameterModifiers = make.Modifiers(1L<<34, Collections.<AnnotationTree>emptyList()); |
475 |
params.add(make.Variable(parameterModifiers, formArgName.getSimpleName(), make.Type(formArgType), null)); |
476 |
} |
477 |
|
478 |
List<ExpressionTree> throwsList = new ArrayList<ExpressionTree>(); |
479 |
for (TypeMirror tm : et.getThrownTypes()) { |
480 |
throwsList.add((ExpressionTree)make.Type(tm)); |
481 |
} |
482 |
|
506 |
|
483 |
BlockTree body; |
507 |
BlockTree body; |
484 |
List<AnnotationTree> annotations = new ArrayList<AnnotationTree>(); |
|
|
485 |
if (isAbstract) { |
508 |
if (isAbstract) { |
486 |
List<StatementTree> blockStatements = new ArrayList<StatementTree>(); |
509 |
List<StatementTree> blockStatements = new ArrayList<StatementTree>(); |
487 |
TypeElement uoe = copy.getElements().getTypeElement("java.lang.UnsupportedOperationException"); //NOI18N |
510 |
TypeElement uoe = copy.getElements().getTypeElement("java.lang.UnsupportedOperationException"); //NOI18N |
Lines 502-524
public final class GeneratorUtilities {
Link Here
|
502 |
body = make.Block(Collections.singletonList(statement), false); |
525 |
body = make.Block(Collections.singletonList(statement), false); |
503 |
} |
526 |
} |
504 |
|
527 |
|
|
|
528 |
MethodTree prototype = createMethod(type, element); |
529 |
ModifiersTree mt = prototype.getModifiers(); |
530 |
|
505 |
//add @Override annotation: |
531 |
//add @Override annotation: |
506 |
SpecificationVersion thisFOVersion = new SpecificationVersion(SourceLevelQuery.getSourceLevel(copy.getFileObject())); |
532 |
SpecificationVersion thisFOVersion = new SpecificationVersion(SourceLevelQuery.getSourceLevel(copy.getFileObject())); |
507 |
SpecificationVersion version15 = new SpecificationVersion("1.5"); //NOI18N |
533 |
SpecificationVersion version15 = new SpecificationVersion("1.5"); //NOI18N |
508 |
|
534 |
|
509 |
if (thisFOVersion.compareTo(version15) >= 0) { |
535 |
if (thisFOVersion.compareTo(version15) >= 0) { |
510 |
boolean generate = true; |
536 |
boolean generate = true; |
511 |
|
537 |
|
512 |
if (thisFOVersion.compareTo(version15) == 0) { |
538 |
if (thisFOVersion.compareTo(version15) == 0) { |
513 |
generate = !element.getEnclosingElement().getKind().isInterface(); |
539 |
generate = !element.getEnclosingElement().getKind().isInterface(); |
514 |
} |
540 |
} |
515 |
|
541 |
|
516 |
if (generate) { |
542 |
if (generate) { |
517 |
annotations.add(make.Annotation(make.Identifier("Override"), Collections.<ExpressionTree>emptyList())); //NOI18N |
543 |
mt = make.addModifiersAnnotation(prototype.getModifiers(), make.Annotation(make.Identifier("Override"), Collections.<ExpressionTree>emptyList())); |
518 |
} |
544 |
} |
519 |
} |
545 |
} |
520 |
|
546 |
|
521 |
return make.Method(make.Modifiers(flags, annotations), element.getSimpleName(), returnType, typeParams, params, throwsList, body, null); |
547 |
return make.Method(mt, prototype.getName(), prototype.getReturnType(), prototype.getTypeParameters(), prototype.getParameters(), prototype.getThrows(), body, null); |
522 |
} |
548 |
} |
523 |
|
549 |
|
524 |
private static class ClassMemberComparator { |
550 |
private static class ClassMemberComparator { |