diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 5de3e0463..cf4ab7a04 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "6"; public const string Build = "3"; - public const string Revision = "2570"; + public const string Revision = "2573"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index e554e129f..be9e428a6 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=3 -%REVISION%=2570 %MINOR%=6 +%REVISION%=2573 +%COREVERSION%=3 %MAJOR%=3 diff --git a/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas b/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas index 294747533..937a70769 100644 --- a/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas +++ b/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas @@ -1,3 +1,4 @@ +{$platformtarget x86} // Вызов функции из обычной dll function add(a,b: integer): integer; external 'NativeDll.dll' name 'add'; // объÑ�вление внешней функции diff --git a/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html b/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html index c1d886bdf..d3ef2edba 100644 --- a/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html +++ b/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html @@ -26,6 +26,7 @@ + @@ -77,6 +78,11 @@ ññûëî÷íîé ñåìàíòèêîé.

{$string_nullbased+} - âêëþ÷åíèå ñòðîê, èíäåêñèðóåìûõ ñ 0.

{$string_nullbased-} - âûêëþ÷åíèå ñòðîê, èíäåêñèðóåìûõ ñ 0.

+

{$platformtarget +x86} - êîìïèëÿöèÿ äëÿ 32-áèòíîé ïëàòôîðìû (òðåáóåòñÿ äëÿ ïîäêëþ÷åíèÿ +32-áèòíûõ dll)

+

{$platformtarget +x64} - êîìïèëÿöèÿ äëÿ 64-áèòíîé ïëàòôîðìû

Äèðåêòèâû $ifdef, $ifndef ñîâìåñòíî ñ äèðåêòèâàìè $else è $endif óïðàâëþò óñëîâíîé êîìïèëÿöèåé ÷àñòåé èñõîäíîãî ôàéëà. Êàæäîé äèðåêòèâå $ifdef, $ifndef äîëæíà ñîîòâåòñòâîâàòü çàâåðøàþùàÿ åå diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html index 660d0e647..37c86e028 100644 --- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html +++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html @@ -6,6 +6,8 @@ + + @@ -40,6 +42,10 @@
        Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå function Pred(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;
        Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå +function SeekEof: boolean; +
        Ïðîïóñêàåò ïðîáåëüíûå ñèìâîëû, ïîñëå ÷åãî âîçâðàùàåò True, åñëè äîñòèãíóò êîíåö ïîòîêà ââîäà +function SeekEoln: boolean; +
        Ïðîïóñêàåò ïðîáåëüíûå ñèìâîëû, ïîñëå ÷åãî âîçâðàùàåò True, åñëè äîñòèãíóò êîíåö ñòðîêè function Succ(x: öåëîå): öåëîå;
        Âîçâðàùàåò ñëåäóþùåå çà x çíà÷åíèå function Succ(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï; diff --git a/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html b/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html index 81fdaaf6b..563fa43fb 100644 --- a/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html +++ b/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html @@ -1,5 +1,6 @@ + @@ -24,6 +25,8 @@ function Center: Point;
        Öåíòð ãðàôè÷åñêîãî îêíà +function ClientRect: GRect; +
        Êëèåíòñêèé ïðÿìîóãîëüíèê ãðàôè÷åñêîãî îêíà procedure Fill(fname: string);
        Çàïîëíÿåò ñîäåðæèìîå ãðàôè÷åñêîãî îêíà îáîÿìè èç ôàéëà ñ èìåíåì fname diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index ef840bcb5..97257f394 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -271,5 +271,6 @@ script= + diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index f9a1f9676..99f74c384 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.6.3.2570 +3.6.3.2573 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 47547ce07..c9ff917aa 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.6.3.2570' +!define VERSION '3.6.3.2573' diff --git a/SyntaxTreeConverters/StandardSyntaxConverter.cs b/SyntaxTreeConverters/StandardSyntaxConverter.cs index 5a17e2746..ce270598f 100644 --- a/SyntaxTreeConverters/StandardSyntaxConverter.cs +++ b/SyntaxTreeConverters/StandardSyntaxConverter.cs @@ -20,8 +20,8 @@ namespace PascalABCCompiler.SyntaxTreeConverters // FillParentNodeVisitor раÑ�положен в SyntaxTree/tree как базовый визитор, отвечающий за поÑ�троение дерева //FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не вÑ�Ñ‘. Ð� Ñ�ледующий вызов - вÑ�Ñ‘ root.FillParentsInAllChilds(); - // new range - до вÑ�его! До выноÑ�а выражениÑ� Ñ� лÑ�мбдой из foreach - NewRangeDesugarVisitor.New.ProcessNode(root); + // new range - до вÑ�его! До выноÑ�а выражениÑ� Ñ� лÑ�мбдой из foreach. 11.07 добавил поиÑ�к yields и приÑ�ваивание pd.HasYield + NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root); // Unnamed Records перенёÑ� Ñ�юда UnnamedRecordsCheckVisitor.New.ProcessNode(root); diff --git a/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs index 08d709caa..7915d2d75 100644 --- a/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs @@ -10,11 +10,11 @@ using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.SugarVisitors { - public class NewRangeDesugarVisitor : BaseChangeVisitor + public class NewRangeDesugarAndFindHasYieldVisitor : BaseChangeVisitor { - public static NewRangeDesugarVisitor New + public static NewRangeDesugarAndFindHasYieldVisitor New { - get { return new NewRangeDesugarVisitor(); } + get { return new NewRangeDesugarAndFindHasYieldVisitor(); } } public override void visit(diapason_expr_new diap) @@ -97,5 +97,28 @@ namespace SyntaxVisitors.SugarVisitors }*/ else base.visit(fe); } + + List lpd = new List(); + + public override void visit (procedure_definition pd) + { + lpd.Add(pd); + base.visit(pd); + lpd.RemoveAt(lpd.Count - 1); + } + public override void visit(yield_node yn) + { + if (lpd.Count > 0) + lpd[lpd.Count - 1].has_yield = true; + base.visit(yn); + } + + public override void visit(yield_sequence_node yn) + { + if (lpd.Count > 0) + lpd[lpd.Count - 1].has_yield = true; + base.visit(yn); + } + } } \ No newline at end of file diff --git a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs index cbc1cb65a..3750ed268 100644 --- a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs @@ -224,43 +224,49 @@ namespace SyntaxVisitors.SugarVisitors Debug.Assert(GetAscendant(isPatternExpr) != null, "Couldn't find statement list in upper nodes"); - var l = new List(); - //l.Add(stat); - var pp = isPatternExpr.right?.parameters; - if (pp != null) + syntax_tree_node stn = isPatternExpr; + while (stn != null && !(stn is procedure_definition) && !(stn is function_lambda_definition)) + stn = stn.Parent; + if (stn is procedure_definition pd && pd.has_yield) { - foreach (var p in pp) + var l = new List(); + var pp = isPatternExpr.right?.parameters; + if (pp != null) { - if (p is var_deconstructor_parameter vdp) + foreach (var p in pp) { - var idClone = vdp.identifier.TypedClone(); - var idNew = vdp.identifier.TypedClone(); - idNew.name = GenerateNewName(idNew.name); - var vs = new var_statement(idClone, idNew, idClone.source_context); - vdp.identifier.name = idNew.name; - l.Add(vs); + if (p is var_deconstructor_parameter vdp) + { + var idClone = vdp.identifier.TypedClone(); + var idNew = vdp.identifier.TypedClone(); + idNew.name = GenerateNewName(idNew.name); + var vs = new var_statement(idClone, idNew, idClone.source_context); + vdp.identifier.name = idNew.name; + l.Add(vs); + } } } + + var stat = GetAscendant(isPatternExpr); + if (stat is if_node ifn) + { + //l.Add(ifn.then_body); + if (!(ifn.then_body is statement_list)) + { + ifn.then_body = new statement_list(ifn.then_body); + } + (ifn.then_body as statement_list).list.InsertRange(0, l); + } + else + { + l.Insert(0, stat); + foreach (var x in l) + x.Parent = stat.Parent; + var stl = stat.Parent as statement_list; + stl.ReplaceInList(stat, l); + } } - var stat = GetAscendant(isPatternExpr); - if (stat is if_node ifn) - { - //l.Add(ifn.then_body); - if (!(ifn.then_body is statement_list)) - { - ifn.then_body = new statement_list(ifn.then_body); - } - (ifn.then_body as statement_list).list.InsertRange(0, l); - } - else - { - l.Insert(0, stat); - foreach (var x in l) - x.Parent = stat.Parent; - var stl = stat.Parent as statement_list; - stl.ReplaceInList(stat, l); - } //ReplaceStatement(stat, l); // тут нельзÑ�. diff --git a/TestSuite/isVar.pas b/TestSuite/isVar.pas new file mode 100644 index 000000000..a79533683 --- /dev/null +++ b/TestSuite/isVar.pas @@ -0,0 +1,4 @@ +begin + var b := ('abc' is string(var s)) and (s = 'abc'); + Assert(b); +end. \ No newline at end of file diff --git a/TestSuite/isvar2.pas b/TestSuite/isvar2.pas deleted file mode 100644 index 4808ebbc9..000000000 --- a/TestSuite/isvar2.pas +++ /dev/null @@ -1,18 +0,0 @@ -function f1(o: object): sequence of object; -begin - - //var c := o is object(var a); - if o is object(var a) then - begin - // var b := a; - // Writeln(a); // object - yield a; - Assert(a <> nil); // nil - // Writeln(b); // object - // b := b; - end; -end; - -begin - foreach var o in f1(new object) do -end. \ No newline at end of file diff --git a/TestSuite/isvar3.pas b/TestSuite/isvar3.pas deleted file mode 100644 index 4f10e0e48..000000000 --- a/TestSuite/isvar3.pas +++ /dev/null @@ -1,19 +0,0 @@ -function f1(o: object): sequence of object; -begin - - //var c := o is object(var a); - if o is object(var a) then - //begin - // var b := a; - // Writeln(a); // object - yield a; - //Assert(a <> nil); // nil - // Writeln(b); // object - // b := b; - //end; -end; - -begin - foreach var o in f1(new object) do - Assert(o<>nil) -end. \ No newline at end of file diff --git a/TestSuite/isvar4.pas b/TestSuite/isvar4.pas deleted file mode 100644 index 3d54646af..000000000 --- a/TestSuite/isvar4.pas +++ /dev/null @@ -1,19 +0,0 @@ -function f1(o: object): sequence of object; -begin - - var c := o is object(var a); - //if o is object(var a) then - //begin - // var b := a; - // Writeln(a); // object - yield a; - Assert(a <> nil); // nil - // Writeln(b); // object - // b := b; - //end; -end; - -begin - foreach var o in f1(new object) do - -end. \ No newline at end of file diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm index 6a00647bf..86bfda65d 100644 Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ