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(); }
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)); }
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(); }
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(); }
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); }