Example #1
0
 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) + ")");
        }
Example #3
0
        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);
                    }
                }
            }
        }
    }
Example #4
0
        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;
            }
        }