Exemple #1
0
        private FunctionParameter(ExpressionReadMode readMode, string name, INameReference typeName, Variadic variadic,
                                  IExpression defaultValue, EntityModifier modifier, bool isNameRequired)
        {
            this.UsageMode      = readMode;
            this.Modifier       = modifier ?? EntityModifier.None;
            this.Name           = NameDefinition.Create(name);
            this.IsNameRequired = isNameRequired;
            this.Variadic       = variadic;

            this.ElementTypeName = typeName;
            if (this.IsVariadic)
            {
                this.TypeName = NameFactory.ReferenceNameReference(NameFactory.ISequenceNameReference(this.ElementTypeName,
                                                                                                      mutability: TypeMutability.ForceMutable));
            }
            else
            {
                this.TypeName = this.ElementTypeName;
            }

            this.defaultValue = defaultValue;

            this.instancesCache = new EntityInstanceCache(this, () => GetInstance(TypeMutability.None,
                                                                                  TemplateTranslation.CreateParameterless(this), Lifetime.Timeless));

            this.attachPostConstructor();
        }
Exemple #2
0
        private VariableDeclaration(EntityModifier modifier, ExpressionReadMode readMode, string name,
                                    INameReference typeName,
                                    IExpression initValue,
                                    IEnumerable <LabelReference> friends = null)
            : base(readMode)
        {
            if (name == null)
            {
                throw new ArgumentNullException();
            }

            this.Modifier     = modifier ?? EntityModifier.None;
            this.Name         = NameDefinition.Create(name);
            this.TypeName     = typeName;
            this.initValue    = initValue;
            this.AccessGrants = (friends ?? Enumerable.Empty <LabelReference>()).StoreReadOnly();

            this.instancesCache = new EntityInstanceCache(this, () => GetInstance(TypeMutability.None,
                                                                                  TemplateTranslation.CreateParameterless(this), Lifetime.Timeless));

            this.closures = new List <TypeDefinition>();

            this.attachPostConstructor();

            this.flow = Later.Create(() => ExecutionFlow.CreatePath(InitValue));
        }
Exemple #3
0
        private Alias(EntityModifier modifier, string name, INameReference replacement)
            : base(ExpressionReadMode.CannotBeRead)
        {
            if (name == null)
            {
                throw new ArgumentNullException();
            }

            this.Modifier    = (modifier ?? EntityModifier.None) | EntityModifier.Static;
            this.Name        = NameDefinition.Create(name);
            this.Replacement = replacement;

            this.instancesCache = new EntityInstanceCache(this, () => GetInstance(TypeMutability.None,
                                                                                  TemplateTranslation.CreateParameterless(this), Lifetime.Timeless));

            this.attachPostConstructor();
        }
Exemple #4
0
        private Property(IOptions options, EntityModifier modifier, string name, IEnumerable <FunctionParameter> parameters, INameReference typeName,
                         IEnumerable <VariableDeclaration> fields, IEnumerable <FunctionDefinition> getters, IEnumerable <FunctionDefinition> setters)
        {
            if (name == null)
            {
                throw new ArgumentNullException();
            }

            this.Name     = NameDefinition.Create(name);
            this.TypeName = typeName;
            this.Fields   = (fields ?? Enumerable.Empty <VariableDeclaration>()).StoreReadOnly();
            this.getters  = (getters ?? Enumerable.Empty <FunctionDefinition>()).StoreReadOnly();
            this.setters  = (setters ?? Enumerable.Empty <FunctionDefinition>()).StoreReadOnly();
            this.Modifier = (this.Setter == null ? EntityModifier.None : options.ReassignableModifier()) | modifier;

            this.instancesCache = new EntityInstanceCache(this, () => GetInstance(TypeMutability.None,
                                                                                  TemplateTranslation.CreateParameterless(this), Lifetime.Timeless));

            this.attachPostConstructor();
        }
Exemple #5
0
        protected TemplateDefinition(EntityModifier modifier, NameDefinition name,
                                     IEnumerable <TemplateConstraint> constraints, IEnumerable <NameReference> includes) : base()
        {
            modifier = modifier ?? EntityModifier.None;
            if (modifier.HasEnum)
            {
                modifier |= EntityModifier.Const;
            }

            this.Includes    = (includes ?? Enumerable.Empty <NameReference>()).StoreReadOnly();
            this.Modifier    = modifier;
            this.Constraints = (constraints ?? Enumerable.Empty <TemplateConstraint>()).StoreReadOnly();
            this.ownedNodes  = new HashSet <INode>(ReferenceEqualityComparer <INode> .Instance);
            this.Name        = name;

            {
                var set = this.Constraints.ToHashSet();
                foreach (TemplateParameter param in name.Parameters)
                {
                    TemplateConstraint constraint = this.Constraints.SingleOrDefault(it => it.Name.Name == param.Name);
                    param.SetConstraint(constraint);
                    set.Remove(constraint);

                    this.AddNode(param.AssociatedType);
                }

                this.Conditionals = set;
            }

            this.instancesCache = new EntityInstanceCache(this,
                                                          () => this.GetInstance(
                                                              TypeMutability.None,
                                                              TemplateTranslation.Create(this, this.Name.Parameters.Select(it => it.InstanceOf)),
                                                              Lifetime.Timeless));

            this.evaluation = new Lazy <EvaluationInfo>(() => Environment.JokerEval);
        }