Исправление s[^1] в zerobasedstrings

This commit is contained in:
Mikhalkovich Stanislav 2021-09-04 17:59:08 +03:00
parent c70063db15
commit 3396fddd6b
8 changed files with 39 additions and 8 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3"; public const string Major = "3";
public const string Minor = "8"; public const string Minor = "8";
public const string Build = "1"; public const string Build = "1";
public const string Revision = "2979"; public const string Revision = "2980";
public const string MainVersion = Major + "." + Minor; public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=8
%REVISION%=2979
%COREVERSION%=1 %COREVERSION%=1
%REVISION%=2980
%MINOR%=8
%MAJOR%=3 %MAJOR%=3

View file

@ -1 +1 @@
3.8.1.2979 3.8.1.2980

View file

@ -1 +1 @@
!define VERSION '3.8.1.2979' !define VERSION '3.8.1.2980'

View file

@ -820,6 +820,11 @@ type
Result := str.Length - IndexValue + 1; Result := str.Length - IndexValue + 1;
end; end;
function Reverse0(str: string): integer;
begin
Result := str.Length - IndexValue;
end;
function Reverse(arr: System.Array; dim: integer): integer; function Reverse(arr: System.Array; dim: integer): integer;
begin begin
Result := arr.GetLength(dim) - IndexValue; Result := arr.GetLength(dim) - IndexValue;

View file

@ -0,0 +1,8 @@
{$zerobasedstrings}
begin
var s := 'ABCD';
Assert(s[^1]='D');
Assert(s[^2]='C');
Assert(s[^3]='B');
Assert(s[^4]='A');
end.

View file

@ -5417,7 +5417,6 @@ namespace PascalABCCompiler.TreeConverter
semantic_node sn = convert_semantic_strong(_dot_node.left); semantic_node sn = convert_semantic_strong(_dot_node.left);
// SSM 17/07/21 учёт ZeroBasedStrings в семантике срезов строк // SSM 17/07/21 учёт ZeroBasedStrings в семантике срезов строк
// Пока не получилось
if (SemanticRules.ZeroBasedStrings if (SemanticRules.ZeroBasedStrings
&& (sn as expression_node)?.type is compiled_type_node ctn && ctn.compiled_type == typeof(string) && (sn as expression_node)?.type is compiled_type_node ctn && ctn.compiled_type == typeof(string)
&& _dot_node.right is ident id0 && _dot_node.right is ident id0
@ -5427,7 +5426,21 @@ namespace PascalABCCompiler.TreeConverter
|| id0.name.ToLower() == "systemslicequestion" || id0.name.ToLower() == "systemslicequestion"
|| id0.name.ToLower() == "systemsliceassignment" || id0.name.ToLower() == "systemsliceassignment"
) )
id0.name += "0"; id0.name += "0"; // SystemSlice0
}
// SSM 04/09/21 учёт ZeroBasedStrings в s[^1]
if (SemanticRules.ZeroBasedStrings
&& (sn as expression_node)?.type.BaseFullName == "PABCSystem.SystemIndex"
&& _dot_node.right is ident id1
&& id1.name.ToLower() == "reverse"
&& _method_call.parameters.Count == 1)
{
var strtn = convert_strong(_method_call.parameters.expressions[0]);
if (strtn.type is compiled_type_node strtnc && strtnc.compiled_type == typeof(string)) // Уф
{
id1.name += "0"; // Reverse0
}
} }
//SyntaxTree.ident id_right = ConvertOperatorNameToIdent(_dot_node.right as SyntaxTree.ident); //SyntaxTree.ident id_right = ConvertOperatorNameToIdent(_dot_node.right as SyntaxTree.ident);

View file

@ -820,6 +820,11 @@ type
Result := str.Length - IndexValue + 1; Result := str.Length - IndexValue + 1;
end; end;
function Reverse0(str: string): integer;
begin
Result := str.Length - IndexValue;
end;
function Reverse(arr: System.Array; dim: integer): integer; function Reverse(arr: System.Array; dim: integer): integer;
begin begin
Result := arr.GetLength(dim) - IndexValue; Result := arr.GetLength(dim) - IndexValue;