Esempio n. 1
0
        CompatibleLambda CreateCompatibleLambda(InstanceAnonymousTypeLinker typeLinker, IWorkshopPortableFunctionIdentifier portableFunction)
        {
            var compatibleLambda = new CompatibleLambda(_assignCurrentIdentifier++, portableFunction.CreateRunner(_parameterRecycler), typeLinker);

            _parameterRecycler.Reset();
            _compatibleLambdas.Add(compatibleLambda);
            return(compatibleLambda);
        }
Esempio n. 2
0
        public override CodeType GetRealType(InstanceAnonymousTypeLinker instanceInfo)
        {
            if (!Attributes.ContainsGenerics)
            {
                return(this);
            }

            return(new PortableLambdaType(new PortableLambdaTypeBuilder(
                                              kind: LambdaKind,
                                              name: Name,
                                              parameters: Parameters.Select(p => p.GetRealType(instanceInfo)).ToArray(),
                                              returnType: ReturnType?.GetRealType(instanceInfo),
                                              returnsValue: ReturnsValue,
                                              parameterTypesKnown: ParameterTypesKnown)));
        }
Esempio n. 3
0
        // Gets a CompatibleLambda that supports the provided type linker and portable function.
        CompatibleLambda GetCompatibleLambda(InstanceAnonymousTypeLinker typeLinker, IWorkshopPortableFunctionIdentifier portableFunction)
        {
            // Iterate through each compatible lambda.
            foreach (var compatibleLambda in _compatibleLambdas)
            {
                // Make sure the keys match and the type linker is compatible..
                if (compatibleLambda.Runner.Key == portableFunction.Key &&
                    compatibleLambda.TypeLinker.Compatible(typeLinker))
                {
                    // This lambda is compatible with the provided lambda.
                    return(compatibleLambda);
                }
            }

            // No compatible lambdas were found.
            return(null);
        }
        public bool HasParameterErrors => _parameterErrors.Any(p => p != null);                 // Are there any parameter errors?

        public OverloadMatch(IOverload option, InstanceAnonymousTypeLinker typeArgLinker, ParseInfo parseInfo, DocRange inferenceErrorRange)
        {
            Option               = option;
            _parseInfo           = parseInfo;
            _inferenceErrorRange = inferenceErrorRange;
            _parameterErrors     = new OverloadMatchError[option.Parameters.Length];

            if (typeArgLinker != null)
            {
                TypeArgLinker = typeArgLinker;
                TypeArgs      = typeArgLinker.TypeArgsFromAnonymousTypes(option.GenericTypes);
            }
            else
            {
                TypeArgLinker = new InstanceAnonymousTypeLinker();
                TypeArgs      = new CodeType[option.TypeArgCount];
            }
        }
Esempio n. 5
0
        public DefinedConstructorInstance(
            CodeType typeInstance,
            DefinedConstructorProvider provider,
            InstanceAnonymousTypeLinker typeLinker,
            Location definedAt
            ) : base(typeInstance, definedAt, AccessLevel.Public)
        {
            Provider    = provider;
            _typeLinker = typeLinker;

            Parameters    = new CodeParameter[provider.ParameterProviders.Length];
            ParameterVars = new IVariableInstance[Parameters.Length];
            for (int i = 0; i < Parameters.Length; i++)
            {
                var parameterInstance = provider.ParameterProviders[i].GetInstance(typeLinker);
                ParameterVars[i] = parameterInstance.Variable;
                Parameters[i]    = parameterInstance.Parameter;
            }

            CallInfo = Provider.CallInfo;
            RestrictedValuesAreFatal = Provider.SubroutineName == null;
        }
Esempio n. 6
0
        public UserFunctionController(ToWorkshop toWorkshop, DefinedMethodInstance function, InstanceAnonymousTypeLinker typeArgs)
        {
            _toWorkshop    = toWorkshop;
            _function      = function;
            _typeArgLinker = typeArgs;
            _allVirtualOptions.Add(function);

            Attributes.IsRecursive = function.Attributes.Recursive;

            // If the function is defined in a type.
            if (function.DefinedInType != null)
            {
                Attributes.IsInstance = true;

                var relations = new MethodClassRelations(toWorkshop, function);

                // Get the class relation.
                _classRelation = relations.ClassRelation;

                // Extract the virtual functions.
                _allVirtualOptions.AddRange(relations.Overriders);
            }
        }
Esempio n. 7
0
 public GetTypeName(bool makeAnonymousTypesUnknown, InstanceAnonymousTypeLinker typeLinker)
 {
     MakeAnonymousTypesUnknown = makeAnonymousTypesUnknown;
     TypeLinker = typeLinker;
 }
 public DefinedConstructorInstance GetInstance(CodeType typeInstance, InstanceAnonymousTypeLinker genericsLinker)
 => new DefinedConstructorInstance(typeInstance, this, genericsLinker, DefinedAt);
Esempio n. 9
0
 public GetVariablesAssigner(InstanceAnonymousTypeLinker typeLinker)
 {
     TypeLinker = typeLinker;
     IsGlobal   = true;
     Tag        = null;
 }
Esempio n. 10
0
 public GetVariablesAssigner(ActionSet actionSet, string tag)
 {
     TypeLinker = actionSet?.ThisTypeLinker;
     IsGlobal   = actionSet?.IsGlobal ?? true;
     Tag        = tag;
 }
Esempio n. 11
0
 public GetVariablesAssigner(ActionSet actionSet)
 {
     TypeLinker = actionSet?.ThisTypeLinker;
     IsGlobal   = actionSet?.IsGlobal ?? true;
     Tag        = null;
 }
Esempio n. 12
0
 public CompatibleLambda(int identifier, IWorkshopPortableFunctionRunner runner, InstanceAnonymousTypeLinker typeLinker)
 {
     Identifier = identifier;
     Runner     = runner;
     TypeLinker = typeLinker;
 }
 public Constructor GetInstance(CodeType initializedType, InstanceAnonymousTypeLinker genericsLinker) => new Constructor(initializedType, _definedAt, AccessLevel.Public);