private SpecializationData createSpecializations(CodeTypeElement clazz) { CodeTypeElement baseSpecialization = clazz.add(createBaseSpecialization()); TypeMirror baseSpecializationType = baseSpecialization.asType(); Map<SpecializationData, CodeTypeElement> generated = new LinkedHashMap<>(); List<SpecializationData> generateSpecializations = new ArrayList<>(); generateSpecializations.add(node.getUninitializedSpecialization()); if (needsPolymorphic()) { generateSpecializations.add(node.getPolymorphicSpecialization()); } generateSpecializations.addAll(reachableSpecializations); for (SpecializationData specialization : generateSpecializations) { generated.put(specialization, clazz.add(createSpecialization(specialization, baseSpecializationType))); } baseSpecialization.addOptional(createCreateNext(generated)); baseSpecialization.addOptional(createCreateFallback(generated)); baseSpecialization.addOptional(createCreatePolymorphic(generated)); baseSpecialization.addOptional(createGetNext(baseSpecialization)); for (NodeExecutionData execution : node.getChildExecutions()) { Collection<TypeMirror> specializedTypes = node.findSpecializedTypes(execution); specializedTypes.add(genericType); for (TypeMirror specializedType : specializedTypes) { if (isExecuteChildShared(execution, specializedType)) { baseSpecialization.addOptional(createExecuteChildMethod(execution, specializedType)); } } } return node.getUninitializedSpecialization(); }
private CodeTypeElement createSpecialization(SpecializationData specialization, TypeMirror baseType) { CodeTypeElement clazz = createClass(node, specialization, modifiers(PRIVATE, STATIC, FINAL), specializationTypeName(specialization), baseType); CodeExecutableElement constructor = clazz.addOptional(createSpecializationConstructor(clazz, specialization, null)); clazz.addOptional(createSpecializationCreateMethod(specialization, constructor)); clazz.addOptional(createMergeMethod(specialization)); clazz.addOptional(createIsSameMethod(specialization)); clazz.addOptional(createIsIdenticalMethod(specialization));
private CodeTypeElement createBaseSpecialization() { CodeTypeElement clazz = createClass(node, null, modifiers(PRIVATE, ABSTRACT, STATIC), specializationTypeName(null), typeSystem.getContext().getType(SpecializationNode.class)); clazz.addOptional(createSpecializationConstructor(clazz, null, null)); clazz.add(new CodeVariableElement(modifiers(PROTECTED, FINAL), nodeType(node), "root")); clazz.addOptional(createUnsupported()); clazz.add(createGetSuppliedChildrenMethod()); clazz.add(createAcceptAndExecute()); for (ExecutableTypeData type : usedTypes) { clazz.add(createFastPathExecuteMethod(null, type, usedTypes)); } return clazz; }
public CodeTypeElement create() { String name = typeName(typeSystem); CodeTypeElement clazz = GeneratorUtils.createClass(typeSystem, null, modifiers(PUBLIC, FINAL), name, typeSystem.getTemplateType().asType()); clazz.add(GeneratorUtils.createConstructorUsingFields(modifiers(PROTECTED), clazz)); CodeVariableElement singleton = createSingleton(clazz); clazz.add(singleton); for (TypeMirror type : typeSystem.getLegacyTypes()) { if (ElementUtils.isVoid(type) || ElementUtils.isObject(type)) { continue; } clazz.addOptional(createIsTypeMethod(type)); clazz.addOptional(createAsTypeMethod(type)); clazz.addOptional(createExpectTypeMethod(type, context.getType(Object.class))); } List<TypeMirror> lookupTargetTypes = typeSystem.lookupTargetTypes(); for (TypeMirror type : lookupTargetTypes) { clazz.add(createExpectImplicitTypeMethodFlat(type)); clazz.add(createIsImplicitTypeMethodFlat(type)); clazz.add(createAsImplicitTypeMethodFlat(type)); clazz.add(createSpecializeImplictTypeMethodFlat(type)); } return clazz; }
public CodeTypeElement create(CodeTypeElement clazz) { for (NodeChildData child : node.getChildren()) { clazz.addOptional(createAccessChildMethod(child)); clazz.addOptional(createExecuteAndSpecialize()); if (shouldReportPolymorphism(node, reachableSpecializations)) { clazz.addOptional(createCheckForPolymorphicSpecialize()); if (requiresCacheCheck()) { clazz.addOptional(createCountCaches()); clazz.addOptional(TypeSystemCodeGenerator.createExpectMethod(PRIVATE, typeSystem, context.getType(Object.class), type));
public CodeTypeElement create() { String name = typeName(typeSystem); CodeTypeElement clazz = GeneratorUtils.createClass(typeSystem, null, modifiers(PUBLIC, FINAL), name, typeSystem.getTemplateType().asType()); clazz.add(GeneratorUtils.createConstructorUsingFields(modifiers(PROTECTED), clazz)); CodeVariableElement singleton = createSingleton(clazz); clazz.add(singleton); for (TypeMirror type : typeSystem.getLegacyTypes()) { if (ElementUtils.isVoid(type) || ElementUtils.isObject(type)) { continue; } clazz.addOptional(createIsTypeMethod(type)); clazz.addOptional(createAsTypeMethod(type)); clazz.addOptional(createExpectTypeMethod(type, context.getType(Object.class))); } List<TypeMirror> lookupTargetTypes = typeSystem.lookupTargetTypes(); for (TypeMirror type : lookupTargetTypes) { clazz.add(createAsImplicitTypeMethod(type, false)); if (typeSystem.getOptions().implicitCastOptimization().isNone()) { clazz.add(createExpectImplicitTypeMethod(type, false)); } clazz.add(createIsImplicitTypeMethod(type, false)); if (typeSystem.getOptions().implicitCastOptimization().isDuplicateTail()) { clazz.add(createAsImplicitTypeMethod(type, true)); clazz.add(createExpectImplicitTypeMethod(type, true)); clazz.add(createIsImplicitTypeMethod(type, true)); clazz.add(createGetImplicitClass(type)); } } return clazz; }
clazz.addOptional(createAccessChildMethod(child)); clazz.addOptional(TypeSystemCodeGenerator.createExpectMethod(PRIVATE, typeSystem, context.getType(Object.class), type));