@Override public TypeMirror getResolvedType() { return receiver.getResolvedType(); }
@Override public TypeMirror getResolvedType() { return receiver.getResolvedType(); }
private CodeTree createAssumptionGuard(AssumptionExpression assumption, CodeTree assumptionValue) { CodeTree assumptionGuard = CodeTreeBuilder.createBuilder().startCall("isValid_").tree(assumptionValue).end().build(); isValidSignatures.put(ElementUtils.getQualifiedName(assumption.getExpression().getResolvedType()), assumption.getExpression().getResolvedType()); return assumptionGuard; }
public void visitBinary(Binary binary) { String operator = binary.getOperator(); TypeMirror leftType = binary.getLeft().getResolvedType(); TypeMirror rightType = binary.getRight().getResolvedType(); if (!ElementUtils.areTypesCompatible(leftType, rightType)) { throw new InvalidExpressionException(String.format("Incompatible operand types %s and %s.", ElementUtils.getSimpleName(leftType), ElementUtils.getSimpleName(rightType))); } TypeMirror booleanType = context.getType(boolean.class); boolean valid; if (LOGIC_OPERATORS.contains(operator)) { valid = ElementUtils.typeEquals(leftType, booleanType); } else if (COMPARABLE_OPERATORS.contains(operator)) { valid = ElementUtils.isPrimitive(leftType); } else if (IDENTITY_OPERATORS.contains(operator)) { valid = leftType.getKind().isPrimitive() || leftType.getKind() == TypeKind.DECLARED || leftType.getKind() == TypeKind.ARRAY; } else { throw new InvalidExpressionException(String.format("The operator %s is undefined.", operator)); } binary.setResolvedType(booleanType); if (!valid) { throw new InvalidExpressionException(String.format("The operator %s is undefined for the argument type(s) %s %s.", operator, ElementUtils.getSimpleName(leftType), ElementUtils.getSimpleName(rightType))); } }
public void visitBinary(Binary binary) { String operator = binary.getOperator(); TypeMirror leftType = binary.getLeft().getResolvedType(); TypeMirror rightType = binary.getRight().getResolvedType(); if (!ElementUtils.areTypesCompatible(leftType, rightType)) { throw new InvalidExpressionException(String.format("Incompatible operand types %s and %s.", ElementUtils.getSimpleName(leftType), ElementUtils.getSimpleName(rightType))); } TypeMirror booleanType = context.getType(boolean.class); boolean valid; if (LOGIC_OPERATORS.contains(operator)) { valid = ElementUtils.typeEquals(leftType, booleanType); } else if (COMPARABLE_OPERATORS.contains(operator)) { valid = ElementUtils.isPrimitive(leftType); } else if (IDENTITY_OPERATORS.contains(operator)) { valid = leftType.getKind().isPrimitive() || leftType.getKind() == TypeKind.DECLARED || leftType.getKind() == TypeKind.ARRAY; } else { throw new InvalidExpressionException(String.format("The operator %s is undefined.", operator)); } binary.setResolvedType(booleanType); if (!valid) { throw new InvalidExpressionException(String.format("The operator %s is undefined for the argument type(s) %s %s.", operator, ElementUtils.getSimpleName(leftType), ElementUtils.getSimpleName(rightType))); } }
lookupMethods = this.methods; } else { TypeMirror type = receiver.getResolvedType(); if (type.getKind() == TypeKind.DECLARED) { TypeMirror sourceType = expression.getResolvedType(); TypeMirror targetType = parameters.get(parameterIndex).asType(); if (!ElementUtils.isAssignable(sourceType, targetType)) { String sep = ""; for (DSLExpression expression : call.getParameters()) { arguments.append(sep).append(ElementUtils.getSimpleName(expression.getResolvedType())); sep = ", ";
lookupVariables = this.variables; } else { TypeMirror type = receiver.getResolvedType(); if (type.getKind() == TypeKind.DECLARED) {
lookupVariables = this.variables; } else { TypeMirror type = receiver.getResolvedType(); if (type.getKind() == TypeKind.DECLARED) {
private void initializeGuards(SpecializationData specialization, DSLExpressionResolver resolver) { final TypeMirror booleanType = context.getType(boolean.class); List<String> guardDefinitions = ElementUtils.getAnnotationValueList(String.class, specialization.getMarkerAnnotation(), "guards"); List<GuardExpression> guardExpressions = new ArrayList<>(); for (String guard : guardDefinitions) { GuardExpression guardExpression; DSLExpression expression = null; try { expression = DSLExpression.parse(guard); expression.accept(resolver); guardExpression = new GuardExpression(specialization, expression); if (!ElementUtils.typeEquals(expression.getResolvedType(), booleanType)) { guardExpression.addError("Incompatible return type %s. Guards must return %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(booleanType)); } } catch (InvalidExpressionException e) { guardExpression = new GuardExpression(specialization, null); guardExpression.addError("Error parsing expression '%s': %s", guard, e.getMessage()); } guardExpressions.add(guardExpression); } specialization.setGuards(guardExpressions); }
private void initializeGuards(SpecializationData specialization, DSLExpressionResolver resolver) { final TypeMirror booleanType = context.getType(boolean.class); List<String> guardDefinitions = ElementUtils.getAnnotationValueList(String.class, specialization.getMarkerAnnotation(), "guards"); List<GuardExpression> guardExpressions = new ArrayList<>(); for (String guard : guardDefinitions) { GuardExpression guardExpression; DSLExpression expression = null; try { expression = DSLExpression.parse(guard); expression.accept(resolver); guardExpression = new GuardExpression(specialization, expression); if (!ElementUtils.typeEquals(expression.getResolvedType(), booleanType)) { guardExpression.addError("Incompatible return type %s. Guards must return %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(booleanType)); } } catch (InvalidExpressionException e) { guardExpression = new GuardExpression(specialization, null); guardExpression.addError("Error parsing expression '%s': %s", guard, e.getMessage()); } guardExpressions.add(guardExpression); } specialization.setGuards(guardExpressions); }
public void loadFastPathState(SpecializationData specialization) { for (CacheExpression cache : specialization.getCaches()) { Parameter cacheParameter = cache.getParameter(); String name = cacheParameter.getVariableElement().getSimpleName().toString(); set(cacheParameter.getLocalName(), new LocalVariable(cacheParameter.getType(), name, CodeTreeBuilder.singleString("this." + name))); } for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) { String name = assumptionName(assumption); TypeMirror type = assumption.getExpression().getResolvedType(); set(name, new LocalVariable(type, name, CodeTreeBuilder.singleString("this." + name))); } }
public void loadFastPathState(SpecializationData specialization) { for (CacheExpression cache : specialization.getCaches()) { Parameter cacheParameter = cache.getParameter(); String name = cacheParameter.getVariableElement().getSimpleName().toString(); set(cacheParameter.getLocalName(), new LocalVariable(cacheParameter.getType(), name, CodeTreeBuilder.singleString("this." + name), null)); } for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) { String name = assumptionName(assumption); TypeMirror type = assumption.getExpression().getResolvedType(); set(name, new LocalVariable(type, name, CodeTreeBuilder.singleString("this." + name), null)); } }
private void initializeAssumptions(SpecializationData specialization, DSLExpressionResolver resolver) { final DeclaredType assumptionType = context.getDeclaredType(Assumption.class); final TypeMirror assumptionArrayType = new ArrayCodeTypeMirror(assumptionType); final List<String> assumptionDefinitions = ElementUtils.getAnnotationValueList(String.class, specialization.getMarkerAnnotation(), "assumptions"); List<AssumptionExpression> assumptionExpressions = new ArrayList<>(); int assumptionId = 0; for (String assumption : assumptionDefinitions) { AssumptionExpression assumptionExpression; DSLExpression expression = null; try { expression = DSLExpression.parse(assumption); expression.accept(resolver); assumptionExpression = new AssumptionExpression(specialization, expression, "assumption" + assumptionId); if (!ElementUtils.isAssignable(expression.getResolvedType(), assumptionType) && !ElementUtils.isAssignable(expression.getResolvedType(), assumptionArrayType)) { assumptionExpression.addError("Incompatible return type %s. Assumptions must be assignable to %s or %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(assumptionType), ElementUtils.getSimpleName(assumptionArrayType)); } if (specialization.isDynamicParameterBound(expression)) { specialization.addError("Assumption expressions must not bind dynamic parameter values."); } } catch (InvalidExpressionException e) { assumptionExpression = new AssumptionExpression(specialization, null, "assumption" + assumptionId); assumptionExpression.addError("Error parsing expression '%s': %s", assumption, e.getMessage()); } assumptionExpressions.add(assumptionExpression); } specialization.setAssumptionExpressions(assumptionExpressions); }
private void initializeAssumptions(SpecializationData specialization, DSLExpressionResolver resolver) { final DeclaredType assumptionType = context.getDeclaredType(Assumption.class); final TypeMirror assumptionArrayType = new ArrayCodeTypeMirror(assumptionType); final List<String> assumptionDefinitions = ElementUtils.getAnnotationValueList(String.class, specialization.getMarkerAnnotation(), "assumptions"); List<AssumptionExpression> assumptionExpressions = new ArrayList<>(); int assumptionId = 0; for (String assumption : assumptionDefinitions) { AssumptionExpression assumptionExpression; DSLExpression expression = null; try { expression = DSLExpression.parse(assumption); expression.accept(resolver); assumptionExpression = new AssumptionExpression(specialization, expression, "assumption" + assumptionId); if (!ElementUtils.isAssignable(expression.getResolvedType(), assumptionType) && !ElementUtils.isAssignable(expression.getResolvedType(), assumptionArrayType)) { assumptionExpression.addError("Incompatible return type %s. Assumptions must be assignable to %s or %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(assumptionType), ElementUtils.getSimpleName(assumptionArrayType)); } if (specialization.isDynamicParameterBound(expression)) { specialization.addError("Assumption expressions must not bind dynamic parameter values."); } } catch (InvalidExpressionException e) { assumptionExpression = new AssumptionExpression(specialization, null, "assumption" + assumptionId); assumptionExpression.addError("Error parsing expression '%s': %s", assumption, e.getMessage()); } assumptionExpressions.add(assumptionExpression); assumptionId++; } specialization.setAssumptionExpressions(assumptionExpressions); }
private List<IfTriple> createAssumptionSlowPathTriples(FrameState frameState, SpecializationGroup group, AssumptionExpression assumption) throws AssertionError { List<IfTriple> triples = new ArrayList<>(); LocalVariable var = frameState.get(assumption.getId()); CodeTree declaration = null; if (var == null) { triples.addAll(initializeCaches(frameState, group, group.getSpecialization().getBoundCaches(assumption.getExpression()), NodeExecutionMode.SLOW_PATH, true, false)); CodeTree assumptionExpressions = DSLExpressionGenerator.write(assumption.getExpression(), null, castBoundTypes(bindExpressionValues(frameState, assumption.getExpression(), group.getSpecialization()))); String name = createAssumptionFieldName(group.getSpecialization(), assumption); var = new LocalVariable(assumption.getExpression().getResolvedType(), name.substring(0, name.length() - 1), null); frameState.set(assumption.getId(), var); declaration = var.createDeclaration(assumptionExpressions); } triples.add(new IfTriple(declaration, createAssumptionGuard(assumption, var.createReference()), null)); return triples; }
private void initializeLimit(SpecializationData specialization, DSLExpressionResolver resolver) { AnnotationValue annotationValue = ElementUtils.getAnnotationValue(specialization.getMessageAnnotation(), "limit"); String limitValue; if (annotationValue == null) { limitValue = ""; } else { limitValue = (String) annotationValue.getValue(); } if (limitValue.isEmpty()) { limitValue = "3"; } else if (!specialization.hasMultipleInstances()) { specialization.addWarning(annotationValue, "The limit expression has no effect. Multiple specialization instantiations are impossible for this specialization."); return; } TypeMirror expectedType = context.getType(int.class); try { DSLExpression expression = DSLExpression.parse(limitValue); expression.accept(resolver); if (!ElementUtils.typeEquals(expression.getResolvedType(), expectedType)) { specialization.addError(annotationValue, "Incompatible return type %s. Limit expressions must return %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(expectedType)); } if (specialization.isDynamicParameterBound(expression)) { specialization.addError(annotationValue, "Limit expressions must not bind dynamic parameter values."); } specialization.setLimitExpression(expression); } catch (InvalidExpressionException e) { specialization.addError(annotationValue, "Error parsing expression '%s': %s", limitValue, e.getMessage()); } }
private void initializeLimit(SpecializationData specialization, DSLExpressionResolver resolver) { AnnotationValue annotationValue = ElementUtils.getAnnotationValue(specialization.getMessageAnnotation(), "limit"); String limitValue; if (annotationValue == null) { limitValue = ""; } else { limitValue = (String) annotationValue.getValue(); } if (limitValue.isEmpty()) { limitValue = "3"; } else if (!specialization.hasMultipleInstances()) { specialization.addWarning(annotationValue, "The limit expression has no effect. Multiple specialization instantiations are impossible for this specialization."); return; } TypeMirror expectedType = context.getType(int.class); try { DSLExpression expression = DSLExpression.parse(limitValue); expression.accept(resolver); if (!ElementUtils.typeEquals(expression.getResolvedType(), expectedType)) { specialization.addError(annotationValue, "Incompatible return type %s. Limit expressions must return %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(expectedType)); } if (specialization.isDynamicParameterBound(expression)) { specialization.addError(annotationValue, "Limit expressions must not bind dynamic parameter values."); } specialization.setLimitExpression(expression); } catch (InvalidExpressionException e) { specialization.addError(annotationValue, "Error parsing expression '%s': %s", limitValue, e.getMessage()); } }
if (isNodeInterfaceArray(expression.getExpression().getResolvedType())) { return true;
private CodeTree createFastPathAssumptionCheck(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData forType, FrameState frameState) throws AssertionError { CodeTreeBuilder builder = parent.create(); builder.startIf(); String sep = ""; for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) { builder.string(sep); builder.string("!"); builder.startCall("isValid_").tree(createAssumptionReference(frameState, specialization, assumption)).end(); isValidSignatures.put(ElementUtils.getQualifiedName(assumption.getExpression().getResolvedType()), assumption.getExpression().getResolvedType()); sep = " || "; } builder.end().startBlock(); builder.tree(createTransferToInterpreterAndInvalidate()); builder.tree(createRemoveThis(builder, frameState, forType, specialization)); builder.end(); return builder.build(); }
expression.accept(localResolver); cacheExpression = new CacheExpression(parameter, annotationMirror, expression); if (!ElementUtils.typeEquals(expression.getResolvedType(), parameter.getType())) { cacheExpression.addError("Incompatible return type %s. The expression type must be equal to the parameter type %s.", ElementUtils.getSimpleName(expression.getResolvedType()), ElementUtils.getSimpleName(parameter.getType()));