mirror of
https://onedev.site.tesses.net/crosslang/crosslangdevstudio
synced 2026-02-08 09:15:45 +00:00
Get way further
This commit is contained in:
222
CrossLangFile.cs
222
CrossLangFile.cs
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user