Skip to content

Commit ff4adc1

Browse files
authored
Merge pull request #10 from dynasist/AddRangeAndProperties
Add range and properties
2 parents 75f1802 + 96a7820 commit ff4adc1

3 files changed

Lines changed: 45 additions & 15 deletions

File tree

ALObjectParser.Library/Models/ALObjectParts/ALMethod.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23

34
namespace ALObjectParser.Library
@@ -22,5 +23,6 @@ public ALMethod()
2223
public ALMethodBody MethodBody { get; set; }
2324
public ICollection<ALAttribute> Attributes { get; set; }
2425
public IEnumerable<ALComment> Comments { get; set; }
26+
public Range MethodRange { get; set; }
2527
}
2628
}

ALObjectParser.Library/Readers/ALObjectReaderBase.cs

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public IALObject Read(IEnumerable<string> Lines)
9393
GetObjectProperties(Lines, Target);
9494
GetGlobalVariables(Lines, Target);
9595
GetSections(Lines, Target);
96+
GetRange(Lines, Target);
9697
Target.ProcessSections();
9798
IALObject NewTarget;
9899
OnRead(Lines, Target, out NewTarget);
@@ -248,7 +249,7 @@ public virtual void OnGetObjectProperty(string Line, IALSection Target, string p
248249
/// <param name="Target">Current ALObject instance</param>
249250
public void GetMethods(IEnumerable<string> Lines, IALSection Target)
250251
{
251-
var pattern = @"^\s{0,4}(local|procedure|trigger)\s+(.*?)\((.*?)\)\:?(.*)";
252+
var pattern = @"^\s{0,4}(local procedure|procedure|trigger)\s+(.*?)\((.*?)\)\:?(.*)";
252253
var procedures = Lines
253254
.Where(w => Regex.IsMatch(w, pattern))
254255
.ToList();
@@ -333,15 +334,15 @@ public void GetMethods(IEnumerable<string> Lines, IALSection Target)
333334

334335
// Check for Attributes
335336
end = txtLines.IndexOf(s) - 1;
336-
start = txtLines.IndexOf(s) - 1;
337-
var testMethod = Lines.ElementAt(start);
338-
while (testMethod.Trim() != String.Empty &&
337+
start = txtLines.IndexOf(s) - 1;
338+
var testMethod = Lines.ElementAt(start);
339+
while (testMethod.Trim() != String.Empty &&
339340
!testMethod.ToLower().Contains("end;") &&
340341
!testMethod.ToLower().Contains("{"))
342+
{
343+
if (testMethod.ToLower().Contains("[test"))
341344
{
342-
if (testMethod.ToLower().Contains("[test"))
343-
{
344-
method.TestMethod = true;
345+
method.TestMethod = true;
345346
//break;
346347
}
347348

@@ -355,23 +356,23 @@ public void GetMethods(IEnumerable<string> Lines, IALSection Target)
355356
};
356357
attr.IsEvent = attr.Name.ToLower().Contains("event");
357358
method.Attributes.Add(attr);
358-
}
359+
}
359360

360-
start -= 1;
361-
if (start < 0)
362-
{
363-
break;
364-
}
365-
testMethod = Lines.ElementAt(start);
361+
start -= 1;
362+
if (start < 0)
363+
{
364+
break;
366365
}
366+
testMethod = Lines.ElementAt(start);
367+
}
367368

368369
start += 1;
369370
end += 1;
370371
var linesAboveMethod = txtLines
371372
.GetRange(start, end - start)
372373
.Select(s => s.Trim())
373374
.Where(w => !w.StartsWith("["));
374-
//.Where(w => w.StartsWith("//") || w.StartsWith("/*") || w.EndsWith("*/"));
375+
//.Where(w => w.StartsWith("//") || w.StartsWith("/*") || w.EndsWith("*/"));
375376
var txtAboveMethod = string.Join("\r\n", linesAboveMethod);
376377
txtAboveMethod = txtAboveMethod
377378
.Replace("///", "")
@@ -427,6 +428,25 @@ public ICollection<ALComment> GetComments(IEnumerable<string> Lines)
427428

428429
return comments;
429430
}
431+
public void GetRange(IEnumerable<string> Lines, IALObject Target)
432+
{
433+
string contents = String.Join("__", Lines);
434+
foreach (ALMethod method in Target.Methods)
435+
{
436+
Match match = Regex.Match(contents, $"(.*)(local)? (procedure|trigger) {method.Name}\\(", RegexOptions.IgnoreCase);
437+
if (!match.Success)
438+
continue;
439+
string textBeforeProcedure = contents.Substring(0, match.Groups[1].Length);
440+
int startLineNo = (textBeforeProcedure.Length - textBeforeProcedure.Replace("__", "").Length) / 2;
441+
string pattern = ".{" + textBeforeProcedure.Length + "}.+?__ end;";
442+
match = Regex.Match(contents, pattern, RegexOptions.IgnoreCase);
443+
if (!match.Success)
444+
continue;
445+
string textUntilEndOfProcedure = contents.Substring(0, match.Groups[0].Length);
446+
int endLineNo = (textUntilEndOfProcedure.Length - textUntilEndOfProcedure.Replace("__", "").Length) / 2;
447+
method.MethodRange = new Range(startLineNo, endLineNo);
448+
}
449+
}
430450

431451
public void GetSections(IEnumerable<string> Lines, IALSection Target)
432452
{

ALObjectParser.Library/Writers/ALObjectWriterBase.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public virtual string OnWrite(IALObject Target)
6565
using (var writer = new IndentedTextWriter(stringWriter))
6666
{
6767
OnWriteObjectHeader(writer, Target);
68+
OnWriteObjectProperties(writer, Target);
6869
Target.Write(writer);
6970
OnWriteObjectMethods(writer, Target);
7071
OnWriteObjectFooter(writer, Target);
@@ -81,6 +82,13 @@ public virtual void OnWriteObjectHeader(IndentedTextWriter writer, IALObject Tar
8182
writer.WriteLine($"{Target.Type} {Target.Id} {(Target.Name.Contains(' ') ? $"\"{Target.Name}\"" : Target.Name)}");
8283
writer.WriteLine("{");
8384
}
85+
86+
private void OnWriteObjectProperties(IndentedTextWriter writer, IALObject target)
87+
{
88+
foreach (ALProperty aLProperty in target.Properties)
89+
writer.WriteLine(aLProperty.Name + " = " + aLProperty.Value + ";");
90+
}
91+
8492

8593
public virtual void OnWriteObjectMethods(IndentedTextWriter writer, IALObject Target)
8694
{

0 commit comments

Comments
 (0)