protected SubroutineSymbol( SourceFileSymbol declaringSourceFile, string name, SubroutineDeclaration declaration) : base(name) { DeclaringSourceFile = declaringSourceFile; Declaration = declaration; }
private string GetSignature(SubroutineDeclaration member) { var signature = member.Accessibility == Accessibility.Implicit ? string.Empty : member.Accessibility.ToString(); signature += " Sub " + member.IdentifierName + "("; var selectedParams = Parameters.Where(p => !p.IsRemoved).Select(s => s.Name); return(signature + string.Join(", ", selectedParams) + ")"); }
private static void WriteRuntimeInformation( ImmutableArray <SubroutineSymbol> subroutines, ref BufferWriter rtiWriter, ref BufferWriter offsetWriter) { if (subroutines.Length == 0) { return; } foreach (SubroutineSymbol subroutine in subroutines) { offsetWriter.WriteUInt16LE((ushort)rtiWriter.Position); byte kind = subroutine.Kind switch { SymbolKind.Chapter => (byte)0x00, SymbolKind.Scene => (byte)0x01, SymbolKind.Function => (byte)0x02, _ => ThrowHelper.Unreachable <byte>() }; rtiWriter.WriteByte(kind); rtiWriter.WriteLengthPrefixedUtf8String(subroutine.Name); SubroutineDeclaration decl = subroutine.Declaration; rtiWriter.WriteUInt16LE((ushort)decl.DialogueBlocks.Length); foreach (DialogueBlock dialogueBlock in decl.DialogueBlocks) { rtiWriter.WriteLengthPrefixedUtf8String(dialogueBlock.AssociatedBox); rtiWriter.WriteLengthPrefixedUtf8String(dialogueBlock.Name); } if (subroutine.Kind == SymbolKind.Function) { var function = (FunctionSymbol)subroutine; rtiWriter.WriteByte((byte)function.Parameters.Length); foreach (ParameterSymbol parameter in function.Parameters) { rtiWriter.WriteLengthPrefixedUtf8String(parameter.Name); } } } } }
private static void CompileSubroutines( NsxModuleBuilder moduleBuilder, ImmutableArray <SubroutineSymbol> subroutines, ref BufferWriter writer, List <int> subroutineOffsets) { if (subroutines.Length == 0) { return; } var dialogueBlockOffsets = new List <int>(); foreach (SubroutineSymbol subroutine in subroutines) { subroutineOffsets.Add(writer.Position); SubroutineDeclaration decl = subroutine.Declaration; int dialogueBlockCount = decl.DialogueBlocks.Length; int start = writer.Position; int offsetBlockSize = sizeof(ushort) + dialogueBlockCount * sizeof(ushort); writer.Position += 2 + offsetBlockSize; dialogueBlockOffsets.Clear(); int codeStart = writer.Position; Emitter.CompileSubroutine(moduleBuilder, subroutine, ref writer, dialogueBlockOffsets); int codeEnd = writer.Position; int codeSize = codeEnd - codeStart; writer.Position = start; writer.WriteUInt16LE((ushort)(offsetBlockSize + codeSize)); writer.WriteUInt16LE((ushort)dialogueBlockCount); for (int i = 0; i < dialogueBlockCount; i++) { writer.WriteUInt16LE((ushort)dialogueBlockOffsets[i]); } writer.Position = codeEnd; } }