Get way further

This commit is contained in:
2025-10-22 17:31:32 -05:00
parent 7c4f85ec21
commit 27f301fe48
39 changed files with 2028 additions and 123 deletions

View File

@@ -16,6 +16,24 @@ using Newtonsoft.Json.Linq;
namespace CrossLangDevStudio;
public static class CrossLangFileExtensions
{
public static void Skip(this Stream strm, long bytes)
{
byte[] data = new byte[1024];
if (strm.CanSeek)
strm.Position += bytes;
else
{
do
{
int read = strm.Read(data, 0, (int)Math.Min(bytes, data.LongLength));
if (read == 0) return;
bytes -= read;
} while (bytes != 0);
}
}
}
public class CrossLangFile
{
@@ -68,7 +86,7 @@ public class CrossLangFile
return Strings[(int)index];
}
uint count = ReadInt();
for (uint i = 0; i < count; i++)
@@ -77,6 +95,42 @@ public class CrossLangFile
uint sectionSize = ReadInt();
switch (section)
{
case "FUNS":
{
uint chks = ReadInt();
for (uint j = 0; j < chks; j++)
{
uint fnParts = ReadInt();
string[] parts = new string[fnParts];
for (uint k = 0; k < fnParts; k++)
{
parts[k] = GetString();
}
uint fid = ReadInt();
Functions.Add(new CrossLangFunction(parts, fid));
}
}
break;
case "CHKS":
{
uint chks = ReadInt();
for (uint j = 0; j < chks; j++)
{
uint fnParts = ReadInt();
string[] parts = new string[fnParts];
for (uint k = 0; k < fnParts; k++)
{
parts[k] = GetString();
}
uint len = ReadInt();
strm.Skip(len);
Chunks.Add(parts);
}
}
break;
case "STRS":
{
uint theCount = ReadInt();
@@ -109,8 +163,69 @@ public class CrossLangFile
Dependencies.Add(new CrossLangDependency() { Name = name, Version = version });
}
break;
case "CLSS":
{
uint chks = ReadInt();
for (uint j = 0; j < chks; j++)
{
string docs = GetString();
uint namePartLen = ReadInt();
string[] nameParts = new string[namePartLen];
for (uint k = 0; k < namePartLen; k++)
{
nameParts[k] = GetString();
}
string name = string.Join(".", nameParts);
uint inhPartLen = ReadInt();
string[] inhParts = new string[inhPartLen];
for (uint k = 0; k < inhPartLen; k++)
{
inhParts[k] = GetString();
}
string inh = string.Join(".", inhParts);
uint entCount = ReadInt();
CrossLangClassEntry[] entries = new CrossLangClassEntry[entCount];
for (uint k = 0; k < entCount; k++)
{
/*
Ensure(stream,main_header,1);
uint8_t sig = main_header[0];
ent.isAbstract = (sig & 0b00001000) != 0;
ent.isFunction = (sig & 0b00000100) == 0;
ent.modifier = (TClassModifier)(sig & 3);
ent.documentation = GetString(stream);
ent.name = GetString(stream);
uint32_t arglen = EnsureInt(stream);
for(uint32_t l = 0; l < arglen; l++)
ent.args.push_back(GetString(stream));
ent.chunkId = EnsureInt(stream);
cls.entry.push_back(ent);
*/
int sig = strm.ReadByte();
if (sig == -1) throw new EndOfStreamException("Could not read flags byte");
bool isAbstract = ((byte)sig & 0b00001000) != 0;
bool isFunction = ((byte)sig & 0b00000100) == 0;
CrossLangClassEntryModifier modifier = (CrossLangClassEntryModifier)(sig & 3);
string ent_doc = GetString();
string ent_name = GetString();
uint arglen = ReadInt();
string[] ent_args = new string[arglen];
for (uint l = 0; l < arglen; l++)
{
ent_args[l] = GetString();
}
uint chunkId = ReadInt();
entries[k] = new CrossLangClassEntry(isAbstract, isFunction, modifier, ent_doc, ent_name, ent_args, chunkId);
}
Classes.Add(new CrossLangClass(docs, nameParts, name, inhParts, inh, entries));
}
}
break;
default:
strm.Position += sectionSize;
strm.Skip(sectionSize);
break;
}
}
@@ -125,7 +240,7 @@ public class CrossLangFile
public CrossLangInfo InfoObject => JsonConvert.DeserializeObject<CrossLangInfo>(Info) ?? new CrossLangInfo();
public Bitmap GetIcon(int height=128)
public Bitmap GetIcon(int height = 128)
{
using (Stream strm = (Icon > -1 && Icon < Resources.Count) ? new MemoryStream(Resources[Icon], false) : AssetLoader.Open(new Uri("avares://CrossLangDevStudio/Assets/crosslang.png")))
{
@@ -133,25 +248,85 @@ public class CrossLangFile
}
}
internal string GetTemplatePrettyName()
internal string GetPrettyName()
{
var info = InfoObject;
if (info is not null)
{
if (!string.IsNullOrWhiteSpace(info.TemplateNamePretty)) return info.TemplateNamePretty;
if (!string.IsNullOrWhiteSpace(info.TemplateName)) return info.TemplateName;
if (!string.IsNullOrWhiteSpace(info.ShortNamePretty)) return info.ShortNamePretty;
if (!string.IsNullOrWhiteSpace(info.ShortName)) return info.ShortName;
}
return this.Name;
}
public List<string> Strings { get; } = new List<string>();
public List<byte[]> Resources { get; } = new List<byte[]>();
public List<byte[]> Resources { get; } = new List<byte[]>();
public List<CrossLangDependency> Dependencies { get; } = new List<CrossLangDependency>();
public List<CrossLangFunction> Functions { get; } = new List<CrossLangFunction>();
public List<CrossLangClass> Classes { get; } = new List<CrossLangClass>();
public List<string[]> Chunks { get; } = new List<string[]>();
}
public class CrossLangClass(string doc, string[] nameParts, string name, string[] inhParts, string inh, CrossLangClassEntry[] ents)
{
public string Documentation => doc;
public string[] NameParts => nameParts;
public string Name => name;
public string[] InheritParts => inhParts;
public string Inherit => inh;
public CrossLangClassEntry[] Entries => ents;
}
public enum CrossLangClassEntryModifier
{
Private,
Protected,
Public,
Static
}
public class CrossLangClassEntry(bool isAbstract, bool isFunction, CrossLangClassEntryModifier modifier, string documentation, string name, string[] args, uint chunkId)
{
public bool IsAbstract => isAbstract;
public bool IsFunction => isFunction;
public CrossLangClassEntryModifier Modifier => modifier;
public string Documentation => documentation;
public string Name => name;
public string[] Arguments => args;
public uint ChunkId => chunkId;
/*
Ensure(stream,main_header,1);
uint8_t sig = main_header[0];
ent.isAbstract = (sig & 0b00001000) != 0;
ent.isFunction = (sig & 0b00000100) == 0;
ent.modifier = (TClassModifier)(sig & 3);
ent.documentation = GetString(stream);
ent.name = GetString(stream);
uint32_t arglen = EnsureInt(stream);
for(uint32_t l = 0; l < arglen; l++)
ent.args.push_back(GetString(stream));
ent.chunkId = EnsureInt(stream);
cls.entry.push_back(ent);
*/
}
public class CrossLangFunction(string[] nameParts, uint chunkId)
{
public string[] NameParts => nameParts;
public uint ChunkId => chunkId;
}
public class CrossLangConfig
{
@@ -190,10 +365,13 @@ public class CrossLangInfo
[JsonProperty("description")]
public string? Description { get; set; } //optional but tells people about the package
[JsonProperty("template_name")]
public string? TemplateName { get; set; }
[JsonProperty("template_name_pretty")]
public string? TemplateNamePretty { get; set; }
[JsonProperty("short_name")]
public string? ShortName { get; set; }
public string? ToolName { get; set; }
[JsonProperty("short_name_pretty")]
public string? ShortNamePretty { get; set; }
[JsonProperty("template_project_dependencies")]
public JToken? TemplateDependencies { get; set; }
@@ -201,9 +379,9 @@ public class CrossLangInfo
[JsonProperty("template_info")]
public JToken? TemplateInfo { get; set; }
[JsonProperty("template_extra_text_ftles")]
public JToken? TemplateExtraTextFiles { get; set; }
public JToken? TemplateExtraTextFiles { get; set; }
[JsonProperty("template_ignored_files")]
public JToken? TemplateIgnoredFiles { get; set; }
public JToken? TemplateIgnoredFiles { get; set; }
}
public class CrossLangDependency
@@ -229,9 +407,9 @@ public class CrossLangVersionConverter : Newtonsoft.Json.JsonConverter<CrossLang
string? s = reader.Value as string;
if (!string.IsNullOrWhiteSpace(s))
{
if (CrossLangVersion.TryParse(s, out var version)) return version;
}
if (hasExistingValue)
@@ -244,7 +422,7 @@ public class CrossLangVersionConverter : Newtonsoft.Json.JsonConverter<CrossLang
writer.WriteValue(value.ToString());
}
}
[Newtonsoft.Json.JsonConverter( typeof(CrossLangVersionConverter))]
[Newtonsoft.Json.JsonConverter(typeof(CrossLangVersionConverter))]
public struct CrossLangVersion : IComparable<CrossLangVersion>, IComparable
{
public void CopyTo(byte[] data, int offset = 0)
@@ -350,10 +528,10 @@ public struct CrossLangVersion : IComparable<CrossLangVersion>, IComparable
{
if (offset + 5 > data.Length) return;
Major = data[offset+0];
Minor = data[offset+1];
Patch = data[offset+2];
ushort build = (ushort)(data[offset+3] << 8 | data[offset+4]);
Major = data[offset + 0];
Minor = data[offset + 1];
Patch = data[offset + 2];
ushort build = (ushort)(data[offset + 3] << 8 | data[offset + 4]);
Build = (ushort)(build >> 2);
Stage = (CrossLangVersionStage)(build & 3);
}
@@ -363,7 +541,7 @@ public struct CrossLangVersion : IComparable<CrossLangVersion>, IComparable
public ushort Build { get; set; } = 0;
public static CrossLangVersion OnePointZeroProd => new CrossLangVersion(){Major=1,Minor=0,Patch=0,Build=0,Stage= CrossLangVersionStage.Production};
public static CrossLangVersion OnePointZeroProd => new CrossLangVersion() { Major = 1, Minor = 0, Patch = 0, Build = 0, Stage = CrossLangVersionStage.Production };
public CrossLangVersionStage Stage { get; set; } = CrossLangVersionStage.Development;
@@ -386,7 +564,7 @@ public struct CrossLangVersion : IComparable<CrossLangVersion>, IComparable
public override string ToString()
{
string stage="dev";
string stage = "dev";
switch (Stage)
{
case CrossLangVersionStage.Development: