diff --git a/ServerCodeExcisionCommon/ServerCodeExcisionUtils.cs b/ServerCodeExcisionCommon/ServerCodeExcisionUtils.cs index 5ad91e5..78627c5 100644 --- a/ServerCodeExcisionCommon/ServerCodeExcisionUtils.cs +++ b/ServerCodeExcisionCommon/ServerCodeExcisionUtils.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using Antlr4.Runtime; namespace ServerCodeExcisionCommon @@ -110,6 +111,7 @@ public void SyntaxError(TextWriter output, IRecognizer recognizer, int offending public static class ExcisionUtils { private static char[] NewLineChars = { '\r', '\n' }; + private static char[] SkippableScopeChars = { '\t', '\r', '\n' }; public static int FindScriptIndexForCodePoint(string script, int line, int column) { @@ -141,6 +143,24 @@ public static int FindScriptIndexForCodePoint(string script, int line, int colum return (linesTraversed == line) ? (cursor + column) : -1; } + public static int ShrinkServerScope(string script, int start, int end) + { + bool skip = true; + while (skip) + { + skip = false; + + int search = script.IndexOfAny(NewLineChars, start) + 2; + if ((search < end) && SkippableScopeChars.Contains(script.ElementAt(search))) + { + skip = true; + ++start; + } + } + + return start; + } + public static Type FindFirstDirectChildOfType(Antlr4.Runtime.Tree.IParseTree currentContext) where Type : class { diff --git a/UnrealAngelscriptServerCodeExcision/UnrealAngelscriptSymbolVisitor.cs b/UnrealAngelscriptServerCodeExcision/UnrealAngelscriptSymbolVisitor.cs index 44187b1..8fa1603 100644 --- a/UnrealAngelscriptServerCodeExcision/UnrealAngelscriptSymbolVisitor.cs +++ b/UnrealAngelscriptServerCodeExcision/UnrealAngelscriptSymbolVisitor.cs @@ -263,6 +263,10 @@ public override UnrealAngelscriptNode VisitPostfixExpression(UnrealAngelscriptPa ExcisionUtils.FindScriptIndexForCodePoint(Script, simpleDeclaration.Stop.Line, simpleDeclaration.Stop.Column) + 1, ExcisionUtils.FindScriptIndexForCodePoint(Script, parentScope.Stop.Line, 0)); + // We need to correct the start index to skip all the possible empty characters/new lines, + // if not we can miss the detection of a manually placed #ifdef + newData.StartIndex = ExcisionUtils.ShrinkServerScope(Script, newData.StartIndex, newData.StopIndex); + if (returnData.ReturnType != EReturnType.NoReturn) { string scopeIndentation = BuildIndentationForColumnCount(simpleDeclaration.Start.Column);