/// <summary> /// Create the class object (and sets the value of the binding). /// </summary> /// <param name="installer">Context within which the class is to be created.</param> /// <returns>Returns true if successful, otherwise false.</returns> protected internal override bool CreateGlobalObject(IDefinitionInstallerContext installer) { if (installer == null) { throw new ArgumentNullException(); } // 1. Get the binding to the global Symbol name = installer.Runtime.GetSymbol(this.Name.Value); ClassBinding binding = installer.GetLocalClassBinding(name); // 2. Check consistency that we didn't mess up in the implementation. if (binding == null) { throw new InvalidOperationException("Should have found a binding, because CreateGlobalBinding() created it!"); } if (binding.Value != null) { throw new InvalidOperationException("Should be an empty binding, because CreateGlobalBinding() complained if one already existed!"); } // 3. Prepare stuff .... SmalltalkClass.InstanceStateEnum instanceState = this.InstanceState.Value; ClassBinding superclass; if (this.SuperclassName.Value.Length == 0) { superclass = null; // Object has no superclass } else { superclass = installer.GetClassBinding(this.SuperclassName.Value); if (superclass == null) { return(installer.ReportError(this.SuperclassName, InstallerErrors.ClassInvalidSuperclass)); } } // Create the collection of class, class-instance, instance variables and imported pools BindingDictionary <InstanceVariableBinding> instVars = new BindingDictionary <InstanceVariableBinding>(installer.Runtime); DiscreteBindingDictionary <ClassVariableBinding> classVars = new DiscreteBindingDictionary <ClassVariableBinding>(installer.Runtime, this.ClassVariableNames.Count()); BindingDictionary <ClassInstanceVariableBinding> classInstVars = new BindingDictionary <ClassInstanceVariableBinding>(installer.Runtime); DiscreteBindingDictionary <PoolBinding> pools = new DiscreteBindingDictionary <PoolBinding>(installer.Runtime); // Validate class variable names ... foreach (SourceReference <string> identifier in this.ClassVariableNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) { return(installer.ReportError(identifier, InstallerErrors.ClassClassVariableNotIdentifier)); } if (classVars.Any <ClassVariableBinding>(varBinding => varBinding.Name == varName)) { return(installer.ReportError(identifier, InstallerErrors.ClassClassVariableNotUnique)); } classVars.Add(new ClassVariableBinding(varName)); } // Validate instance variable names ... foreach (SourceReference <string> identifier in this.InstanceVariableNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) { return(installer.ReportError(identifier, InstallerErrors.ClassInstanceVariableNotIdentifier)); } if (((IEnumerable <InstanceVariableBinding>)instVars).Any(varBinding => varBinding.Name == varName)) { return(installer.ReportError(identifier, InstallerErrors.ClassInstanceVariableNotUnique)); } if (classVars.Any <ClassVariableBinding>(varBinding => varBinding.Name == varName)) { return(installer.ReportError(identifier, InstallerErrors.ClassInstanceOrClassVariableNotUnique)); } instVars.Add(new InstanceVariableBinding(varName)); } // Validate class instance variable names ... foreach (SourceReference <string> identifier in this.ClassInstanceVariableNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) { return(installer.ReportError(identifier, InstallerErrors.ClassClassInstanceVariableNotIdentifier)); } if (classInstVars.Any <ClassInstanceVariableBinding>(varBinding => varBinding.Name == varName)) { return(installer.ReportError(identifier, InstallerErrors.ClassClassInstanceVariableNotUnique)); } if (classVars.Any <ClassVariableBinding>(varBinding => varBinding.Name == varName)) { return(installer.ReportError(identifier, InstallerErrors.ClassClassInstanceOrClassVariableNotUnique)); } classInstVars.Add(new ClassInstanceVariableBinding(varName)); } // Validate imported pool names ... foreach (SourceReference <string> identifier in this.ImportedPoolNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) { return(installer.ReportError(identifier, InstallerErrors.ClassImportedPoolNotIdentifier)); } if (pools.Any <PoolBinding>(varBinding => varBinding.Name == varName)) { return(installer.ReportError(identifier, InstallerErrors.ClassImportedPoolNotUnique)); } PoolBinding pool = installer.GetPoolBinding(varName); if (pool == null) { return(installer.ReportError(identifier, InstallerErrors.ClassImportedPoolNotDefined)); } pools.Add(pool); } // 4. Finally, create the behavior object binding.SetValue(new SmalltalkClass( installer.Runtime, binding.Name, superclass, instanceState, instVars, classVars, classInstVars, pools)); return(true); }
/// <summary> /// Create the class object (and sets the value of the binding). /// </summary> /// <param name="installer">Context within which the class is to be created.</param> /// <returns>Returns true if successful, otherwise false.</returns> protected internal override bool CreateGlobalObject(IInstallerContext installer) { if (installer == null) throw new ArgumentNullException(); // 1. Get the binding to the global Symbol name = installer.Runtime.GetSymbol(this.Name.Value); ClassBinding binding = installer.GetLocalClassBinding(name); // 2. Check consistency that we didn't mess up in the implementation. if (binding == null) throw new InvalidOperationException("Should have found a binding, because CreateGlobalBinding() created it!"); if (binding.Value != null) throw new InvalidOperationException("Should be an empty binding, because CreateGlobalBinding() complained if one already existed!"); // 3. Prepare stuff .... SmalltalkClass.InstanceStateEnum instanceState = this.InstanceState.Value; ClassBinding superclass; if (this.SuperclassName.Value.Length == 0) { superclass = null; // Object has no superclass } else { superclass = installer.GetClassBinding(this.SuperclassName.Value); if (superclass == null) return installer.ReportError(this.SuperclassName, InstallerErrors.ClassInvalidSuperclass); } // Create the collection of class, class-instance, instance variables and imported pools BindingDictionary<InstanceVariableBinding> instVars = new BindingDictionary<InstanceVariableBinding>(installer.Runtime); DiscreteBindingDictionary<ClassVariableBinding> classVars = new DiscreteBindingDictionary<ClassVariableBinding>(installer.Runtime, this.ClassVariableNames.Count()); BindingDictionary<ClassInstanceVariableBinding> classInstVars = new BindingDictionary<ClassInstanceVariableBinding>(installer.Runtime); DiscreteBindingDictionary<PoolBinding> pools = new DiscreteBindingDictionary<PoolBinding>(installer.Runtime); // Validate class variable names ... foreach (SourceReference<string> identifier in this.ClassVariableNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) return installer.ReportError(identifier, InstallerErrors.ClassClassVariableNotIdentifier); if (classVars.Any<ClassVariableBinding>(varBinding => varBinding.Name == varName)) return installer.ReportError(identifier, InstallerErrors.ClassClassVariableNotUnique); classVars.Add(new ClassVariableBinding(varName)); } // Validate instance variable names ... foreach (SourceReference<string> identifier in this.InstanceVariableNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) return installer.ReportError(identifier, InstallerErrors.ClassInstanceVariableNotIdentifier); if (((IEnumerable<InstanceVariableBinding>) instVars).Any(varBinding => varBinding.Name == varName)) return installer.ReportError(identifier, InstallerErrors.ClassInstanceVariableNotUnique); if (classVars.Any<ClassVariableBinding>(varBinding => varBinding.Name == varName)) return installer.ReportError(identifier, InstallerErrors.ClassInstanceOrClassVariableNotUnique); instVars.Add(new InstanceVariableBinding(varName)); } // Validate class instance variable names ... foreach (SourceReference<string> identifier in this.ClassInstanceVariableNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) return installer.ReportError(identifier, InstallerErrors.ClassClassInstanceVariableNotIdentifier); if (classInstVars.Any<ClassInstanceVariableBinding>(varBinding => varBinding.Name == varName)) return installer.ReportError(identifier, InstallerErrors.ClassClassInstanceVariableNotUnique); if (classVars.Any<ClassVariableBinding>(varBinding => varBinding.Name == varName)) return installer.ReportError(identifier, InstallerErrors.ClassClassInstanceOrClassVariableNotUnique); classInstVars.Add(new ClassInstanceVariableBinding(varName)); } // Validate imported pool names ... foreach (SourceReference<string> identifier in this.ImportedPoolNames) { Symbol varName = installer.Runtime.GetSymbol(identifier.Value); if (!IronSmalltalk.Common.Utilities.ValidateIdentifier(identifier.Value)) return installer.ReportError(identifier, InstallerErrors.ClassImportedPoolNotIdentifier); if (pools.Any<PoolBinding>(varBinding => varBinding.Name == varName)) return installer.ReportError(identifier, InstallerErrors.ClassImportedPoolNotUnique); PoolBinding pool = installer.GetPoolBinding(varName); if (pool == null) return installer.ReportError(identifier, InstallerErrors.ClassImportedPoolNotDefined); pools.Add(pool); } // 4. Finally, create the behavior object binding.SetValue(new SmalltalkClass( installer.Runtime, binding.Name, superclass, instanceState, instVars, classVars, classInstVars, pools)); return true; }