public override Verb CreateVerb(string[] tokens) { Color(position, tokens[1].Length, KeyWords); Color(1, Structures); var index = position + length; var superName = ""; Parameters superParameters = null; if (inheritanceParser.Scan(source, index)) { superName = inheritanceParser.VariableName; superParameters = inheritanceParser.Parameters; index = inheritanceParser.Result.Position; } var traits = new List <string>(); if (doesParser.Scan(source, index)) { traits = doesParser.Traits; index = doesParser.Result.Position; } Block objectBlock; try { InClassDefinition = true; ParseBlock(source, index, "'}'").Assign(out objectBlock, out index); } finally { InClassDefinition = false; } var builder = new Class(new Parameters(), objectBlock, GetStaticBlock(), superName, traits.ToArray(), superParameters, false); result.Value = builder; overridePosition = index; return(new CreateObject(VAR_ANONYMOUS + CompilerState.ObjectID(), builder, false, Protected)); }
public static (string, Parameters, string[], int) Ancestors(string source, int index) { var inheritanceParser = new InheritanceParser(); var doesParser = new DoesParser(); var superName = ""; Parameters superParameters = null; if (inheritanceParser.Scan(source, index)) { superName = inheritanceParser.VariableName; superParameters = inheritanceParser.Parameters; index = inheritanceParser.Result.Position; } var traits = new List <string>(); if (doesParser.Scan(source, index)) { traits = doesParser.Traits; index = doesParser.Result.Position; } return(superName, superParameters, traits.ToArray(), index); }
public override Verb CreateVerb(string[] tokens) { Color(position, tokens[1].Length, KeyWords); var name = tokens[2]; Color(name.Length, Types); var index = NextPosition; if (doesParser.Scan(source, index)) { traits = doesParser.Traits; index = doesParser.Position; } if (endOfLineParser.Scan(source, index)) { index = endOfLineParser.Position; } var members = new Hash <string, Value>(); InClassDefinition = true; foreach (var traitName in traits) { var trait = CompilerState.Trait(traitName).Must().HaveValue().Force(LOCATION, () => $"Trait {traitName} isn't defined"); foreach (var(key, value) in trait.Members) { members[key] = value; } } try { AdvanceTabs(); while (index < source.Length) { if (bodyParser.Scan(source, index) && bodyParser.Parser.If(out var parser)) { index = parser.Position; if (parser is ITraitName aTraitName) { var traitName = aTraitName; var memberName = traitName.MemberName; var value = parser.Result.Value; if (value != null) { members[memberName] = value; } else { value = traitName.Getter; if (value != null) { members[GetterName(memberName)] = value; } value = traitName.Setter; if (value != null) { members[SetterName(memberName)] = value; } members[MangledName(memberName)] = new Null(); } } else { return(null); } } else { break; } } } finally { InClassDefinition = false; RegressTabs(); } var newTrait = new Trait(name, members); overridePosition = index; CompilerState.RegisterTrait(newTrait); return(new CreateTrait(newTrait, traits) { Index = position }); }