package it.xsemantics.dsl.typing; import it.xsemantics.dsl.xsemantics.AuxiliaryDescription; import it.xsemantics.dsl.xsemantics.ExpressionInConclusion; import it.xsemantics.dsl.xsemantics.InputParameter; import it.xsemantics.dsl.xsemantics.OutputParameter; import it.xsemantics.dsl.xsemantics.RuleParameter; import it.xsemantics.runtime.ErrorInformation; import it.xsemantics.runtime.Result; import it.xsemantics.runtime.RuleApplicationTrace; import it.xsemantics.runtime.RuleEnvironment; import it.xsemantics.runtime.RuleFailedException; import it.xsemantics.runtime.XsemanticsRuntimeSystem; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.common.types.JvmFormalParameter; import org.eclipse.xtext.common.types.JvmTypeReference; import org.eclipse.xtext.util.PolymorphicDispatcher; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.XVariableDeclaration; import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder; import org.eclipse.xtext.xbase.typesystem.IBatchTypeResolver; import org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference; import com.google.common.base.Objects; import com.google.inject.Inject; public class XsemanticsTypeSystemGen extends XsemanticsRuntimeSystem { public final static String XEXPRESSIONTYPE = "it.xsemantics.dsl.typing.rules.XExpressionType"; public final static String XVARIABLEDECLARATIONTYPE = "it.xsemantics.dsl.typing.rules.XVariableDeclarationType"; public final static String RULEINVOCATIONEXPRESSIONTYPE = "it.xsemantics.dsl.typing.rules.RuleInvocationExpressionType"; public final static String EXPRESSIONINCONCLUSIONTYPE = "it.xsemantics.dsl.typing.rules.ExpressionInConclusionType"; public final static String RULEPARAMETERTYPE = "it.xsemantics.dsl.typing.rules.RuleParameterType"; public final static String INPUTPARAMETERTYPE = "it.xsemantics.dsl.typing.rules.InputParameterType"; public final static String OUTPUTPARAMETERTYPE = "it.xsemantics.dsl.typing.rules.OutputParameterType"; public final static String JVMFORMALPARAMETERTYPE = "it.xsemantics.dsl.typing.rules.JvmFormalParameterType"; public final static String AUXILIARYDESCRIPTIONTYPE = "it.xsemantics.dsl.typing.rules.AuxiliaryDescriptionType"; @Inject private JvmTypesBuilder typesBuilder; @Inject private IBatchTypeResolver typeResolver; private PolymorphicDispatcher<Result<JvmTypeReference>> typeDispatcher; public XsemanticsTypeSystemGen() { init(); } public void init() { typeDispatcher = buildPolymorphicDispatcher1( "typeImpl", 3, "|-", ":"); } public JvmTypesBuilder getTypesBuilder() { return this.typesBuilder; } public void setTypesBuilder(final JvmTypesBuilder typesBuilder) { this.typesBuilder = typesBuilder; } public Result<JvmTypeReference> type(final EObject exp) { return type(new RuleEnvironment(), null, exp); } public Result<JvmTypeReference> type(final RuleEnvironment _environment_, final EObject exp) { return type(_environment_, null, exp); } public Result<JvmTypeReference> type(final RuleEnvironment _environment_, final RuleApplicationTrace _trace_, final EObject exp) { try { return typeInternal(_environment_, _trace_, exp); } catch (Exception _e_type) { return resultForFailure(_e_type); } } protected Result<JvmTypeReference> typeInternal(final RuleEnvironment _environment_, final RuleApplicationTrace _trace_, final EObject exp) { try { checkParamsNotNull(exp); return typeDispatcher.invoke(_environment_, _trace_, exp); } catch (Exception _e_type) { sneakyThrowRuleFailedException(_e_type); return null; } } protected void typeThrowException(final String _error, final String _issue, final Exception _ex, final EObject exp, final ErrorInformation[] _errorInformations) throws RuleFailedException { throwRuleFailedException(_error, _issue, _ex, _errorInformations); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final XExpression e) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleXExpressionType(G, _subtrace_, e); addToTrace(_trace_, ruleName("XExpressionType") + stringRepForEnv(G) + " |- " + stringRep(e) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleXExpressionType) { typeThrowException(ruleName("XExpressionType") + stringRepForEnv(G) + " |- " + stringRep(e) + " : " + "JvmTypeReference", XEXPRESSIONTYPE, e_applyRuleXExpressionType, e, new ErrorInformation[] {new ErrorInformation(e)}); return null; } } protected LightweightTypeReference getActualType(XExpression expression) { return typeResolver.resolveTypes(expression).getActualType(expression); } protected Result<JvmTypeReference> applyRuleXExpressionType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final XExpression e) throws RuleFailedException { //JvmTypeReference _type = this.typeProvider.resolveTypes(e).getActualType(e).toTypeReference(); //JvmTypeReference _type = this.typeProvider.getType(e); JvmTypeReference _type = getActualType(e).toTypeReference(); return new Result<JvmTypeReference>(_type); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final XVariableDeclaration e) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleXVariableDeclarationType(G, _subtrace_, e); addToTrace(_trace_, ruleName("XVariableDeclarationType") + stringRepForEnv(G) + " |- " + stringRep(e) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleXVariableDeclarationType) { typeThrowException(ruleName("XVariableDeclarationType") + stringRepForEnv(G) + " |- " + stringRep(e) + " : " + "JvmTypeReference", XVARIABLEDECLARATIONTYPE, e_applyRuleXVariableDeclarationType, e, new ErrorInformation[] {new ErrorInformation(e)}); return null; } } protected Result<JvmTypeReference> applyRuleXVariableDeclarationType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final XVariableDeclaration e) throws RuleFailedException { JvmTypeReference _type = e.getType(); return new Result<JvmTypeReference>(_type); } protected Result<JvmTypeReference> applyRuleRuleInvocationExpressionType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final XExpression e) throws RuleFailedException { JvmTypeReference type = null; // output parameter /* G |- e : type */ XExpression _expression = e; Result<JvmTypeReference> result = typeInternal(G, _trace_, _expression); checkAssignableTo(result.getFirst(), JvmTypeReference.class); type = (JvmTypeReference) result.getFirst(); return new Result<JvmTypeReference>(type); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final ExpressionInConclusion e) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleExpressionInConclusionType(G, _subtrace_, e); addToTrace(_trace_, ruleName("ExpressionInConclusionType") + stringRepForEnv(G) + " |- " + stringRep(e) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleExpressionInConclusionType) { typeThrowException(ruleName("ExpressionInConclusionType") + stringRepForEnv(G) + " |- " + stringRep(e) + " : " + "JvmTypeReference", EXPRESSIONINCONCLUSIONTYPE, e_applyRuleExpressionInConclusionType, e, new ErrorInformation[] {new ErrorInformation(e)}); return null; } } protected Result<JvmTypeReference> applyRuleExpressionInConclusionType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final ExpressionInConclusion e) throws RuleFailedException { JvmTypeReference type = null; // output parameter /* G |- e.expression : type */ XExpression _expression = e.getExpression(); Result<JvmTypeReference> result = typeInternal(G, _trace_, _expression); checkAssignableTo(result.getFirst(), JvmTypeReference.class); type = (JvmTypeReference) result.getFirst(); return new Result<JvmTypeReference>(type); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final RuleParameter p) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleRuleParameterType(G, _subtrace_, p); addToTrace(_trace_, ruleName("RuleParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleRuleParameterType) { typeThrowException(ruleName("RuleParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + "JvmTypeReference", RULEPARAMETERTYPE, e_applyRuleRuleParameterType, p, new ErrorInformation[] {new ErrorInformation(p)}); return null; } } protected Result<JvmTypeReference> applyRuleRuleParameterType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final RuleParameter p) throws RuleFailedException { JvmFormalParameter _parameter = p.getParameter(); JvmTypeReference _parameterType = _parameter.getParameterType(); return new Result<JvmTypeReference>(_parameterType); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final InputParameter p) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleInputParameterType(G, _subtrace_, p); addToTrace(_trace_, ruleName("InputParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleInputParameterType) { typeThrowException(ruleName("InputParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + "JvmTypeReference", INPUTPARAMETERTYPE, e_applyRuleInputParameterType, p, new ErrorInformation[] {new ErrorInformation(p)}); return null; } } protected Result<JvmTypeReference> applyRuleInputParameterType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final InputParameter p) throws RuleFailedException { JvmFormalParameter _parameter = p.getParameter(); JvmTypeReference _parameterType = _parameter.getParameterType(); return new Result<JvmTypeReference>(_parameterType); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final OutputParameter p) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleOutputParameterType(G, _subtrace_, p); addToTrace(_trace_, ruleName("OutputParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleOutputParameterType) { typeThrowException(ruleName("OutputParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + "JvmTypeReference", OUTPUTPARAMETERTYPE, e_applyRuleOutputParameterType, p, new ErrorInformation[] {new ErrorInformation(p)}); return null; } } protected Result<JvmTypeReference> applyRuleOutputParameterType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final OutputParameter p) throws RuleFailedException { JvmTypeReference _jvmTypeReference = p.getJvmTypeReference(); return new Result<JvmTypeReference>(_jvmTypeReference); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final JvmFormalParameter p) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleJvmFormalParameterType(G, _subtrace_, p); addToTrace(_trace_, ruleName("JvmFormalParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleJvmFormalParameterType) { typeThrowException(ruleName("JvmFormalParameterType") + stringRepForEnv(G) + " |- " + stringRep(p) + " : " + "JvmTypeReference", JVMFORMALPARAMETERTYPE, e_applyRuleJvmFormalParameterType, p, new ErrorInformation[] {new ErrorInformation(p)}); return null; } } protected Result<JvmTypeReference> applyRuleJvmFormalParameterType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final JvmFormalParameter p) throws RuleFailedException { JvmTypeReference _parameterType = p.getParameterType(); return new Result<JvmTypeReference>(_parameterType); } protected Result<JvmTypeReference> typeImpl(final RuleEnvironment G, final RuleApplicationTrace _trace_, final AuxiliaryDescription aux) throws RuleFailedException { try { RuleApplicationTrace _subtrace_ = newTrace(_trace_); Result<JvmTypeReference> _result_ = applyRuleAuxiliaryDescriptionType(G, _subtrace_, aux); addToTrace(_trace_, ruleName("AuxiliaryDescriptionType") + stringRepForEnv(G) + " |- " + stringRep(aux) + " : " + stringRep(_result_.getFirst())); addAsSubtrace(_trace_, _subtrace_); return _result_; } catch (Exception e_applyRuleAuxiliaryDescriptionType) { typeThrowException(ruleName("AuxiliaryDescriptionType") + stringRepForEnv(G) + " |- " + stringRep(aux) + " : " + "JvmTypeReference", AUXILIARYDESCRIPTIONTYPE, e_applyRuleAuxiliaryDescriptionType, aux, new ErrorInformation[] {new ErrorInformation(aux)}); return null; } } protected Result<JvmTypeReference> applyRuleAuxiliaryDescriptionType(final RuleEnvironment G, final RuleApplicationTrace _trace_, final AuxiliaryDescription aux) throws RuleFailedException { JvmTypeReference type = null; // output parameter /* { aux.type != null type = aux.type } or type = typesBuilder.newTypeRef(aux, typeof(Boolean)) */ try { JvmTypeReference _xblockexpression = null; { JvmTypeReference _type = aux.getType(); boolean _notEquals = (!Objects.equal(_type, null)); /* aux.type != null */ if (!_notEquals) { sneakyThrowRuleFailedException("aux.type != null"); } JvmTypeReference _type_1 = aux.getType(); JvmTypeReference _type_2 = type = _type_1; _xblockexpression = (_type_2); } } catch (Exception e) { JvmTypeReference _newTypeRef = this.typesBuilder.newTypeRef(aux, Boolean.class); type = _newTypeRef; } return new Result<JvmTypeReference>(type); } }