public ScriptCodegenFieldSharable( ScriptDescriptorCompileTime scriptDescriptor, CodegenClassScope classScope) { _scriptName = scriptDescriptor.ScriptName; _parameters = scriptDescriptor.Parameters; _scriptDescriptor = scriptDescriptor; _classScope = classScope; }
public override ExprNode Validate(ExprValidationContext validationContext) { if (Script.ParameterNames.Length != Parameters.Count) { throw new ExprValidationException( string.Format( "Invalid number of parameters for script '{0}', expected {1} parameters but received {2} parameters", Script.Name, Script.ParameterNames.Length, Parameters.Count)); } if (!validationContext.StatementCompileTimeService.Configuration.Compiler.Scripts.IsEnabled) { throw new ExprValidationException("Script compilation has been disabled by configuration"); } // validate all expression parameters var validatedParameters = Parameters .Select( expr => ExprNodeUtilityValidate.GetValidatedSubtree( ExprNodeOrigin.SCRIPTPARAMS, expr, validationContext)) .ToList(); // set up map of input parameter names and evaluators var forges = new ExprForge[Script.ParameterNames.Length]; for (var i = 0; i < Script.ParameterNames.Length; i++) { forges[i] = validatedParameters[i].Forge; } Parameters = validatedParameters; // Compile script var parameterTypes = ExprNodeUtilityQuery.GetExprResultTypes(forges); var dialect = Script.OptionalDialect ?? _defaultDialect; var compiled = CompileScript( dialect, Script.Name, Script.Expression, Script.ParameterNames, parameterTypes, Script.CompiledBuf, validationContext.ImportService, validationContext.ScriptCompiler); // Determine declared return type var declaredReturnType = GetDeclaredReturnType(Script.OptionalReturnTypeName, validationContext); if (Script.IsOptionalReturnTypeIsArray && declaredReturnType != null) { declaredReturnType = TypeHelper.GetArrayType(declaredReturnType); } Type returnType; if (compiled.KnownReturnType == null && Script.OptionalReturnTypeName == null) { returnType = typeof(object); } else if (compiled.KnownReturnType != null) { if (declaredReturnType == null) { returnType = compiled.KnownReturnType; } else { var knownReturnType = compiled.KnownReturnType; if (declaredReturnType.IsArray && knownReturnType.IsArray) { // we are fine } else if (!knownReturnType.IsAssignmentCompatible(declaredReturnType)) { throw new ExprValidationException( "Return type and declared type not compatible for script '" + Script.Name + "', known return type is " + knownReturnType.Name + " versus declared return type " + declaredReturnType.Name); } returnType = declaredReturnType; } } else { returnType = declaredReturnType; } if (returnType == null) { returnType = typeof(object); } _eventTypeCollection = null; if (Script.OptionalEventTypeName != null) { if (returnType.IsArray && returnType.GetElementType() == typeof(EventBean)) { _eventTypeCollection = EventTypeUtility.RequireEventType( "Script", Script.Name, Script.OptionalEventTypeName, validationContext.StatementCompileTimeService.EventTypeCompileTimeResolver); } else { throw new ExprValidationException(EventTypeUtility.DisallowedAtTypeMessage()); } } _scriptDescriptor = new ScriptDescriptorCompileTime( Script.OptionalDialect, Script.Name, Script.Expression, Script.ParameterNames, Parameters.ToArray(), returnType, _defaultDialect); return null; }