Перенес проверку set array на уровень парсера

Немного поправил Intellisense по наведению для NewSet

По точке там что то другое работает
This commit is contained in:
Mikhalkovich Stanislav 2024-12-17 15:06:57 +03:00
parent 874ddebad3
commit 8a9788e6f9
7 changed files with 28 additions and 18 deletions

View file

@ -1060,7 +1060,12 @@ namespace CodeCompletion
RestoreCurrentUsedAssemblies();
string description = ss.si.description;
if (description != null)
{
description = description.Replace("!#", "");
// Пусть здесь делаем все замены
// Для рекурсивных <<>> нужно писать собственный парсер
description = System.Text.RegularExpressions.Regex.Replace(description, @"NewSet<\s*(.*)\s*>", "set of $1");
}
return description;
}
RestoreCurrentUsedAssemblies();

View file

@ -1264,10 +1264,18 @@ namespace CodeCompletion
method_call_cache[_method_call] = returned_scope;
}
public override void visit(pascal_set_constant _pascal_set_constant)
public override void visit(pascal_set_constant psc)
{
//throw new NotImplementedException();
returned_scope = null;
// returned_scope = null;
var dn = new dot_node(new ident(StringConstants.pascalSystemUnitName), new ident("Arr"), psc.source_context);
var el = new expression_list(psc.values.expressions[0], psc.source_context);
var nn = new method_call(dn, el, psc.source_context);
var dn1 = new dot_node(new ident(StringConstants.pascalSystemUnitName), new ident("__NewSetCreatorInternal"), psc.source_context);
var el1 = new expression_list(nn, psc.source_context);
var nn1 = new method_call(dn1, el1, psc.source_context);
visit(nn1);
}
public override void visit(array_const _array_const)
@ -2048,7 +2056,7 @@ namespace CodeCompletion
public override void visit(array_const_new acn)
{
acn.elements.expressions[0].visit(this);
var rr = this.returned_scope;
//var rr = this.returned_scope;
//var nn = new new_expr((syntax_type, plist, true, new SyntaxTree.array_const(acn.elements, acn.elements.source_context), acn.source_context);
//var nn = new new_expr($2, el, true, $6 as array_const, @$);
var dn = new dot_node(new ident(StringConstants.pascalSystemUnitName), new ident("Arr"), acn.source_context);

View file

@ -2,7 +2,7 @@
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: LAPTOP-TE3HP881
// DateTime: 14.12.2024 20:15:39
// DateTime: 15.12.2024 8:40:15
// UserName: miks
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>

View file

@ -992,15 +992,15 @@ pascal_set_const
: tkSquareOpen elem_list tkSquareClose
{
// Если elem_list пуст или содержит диапазон, то это множество, иначе массив. С PascalABC.NET 3.10
/*var is_set = false;
var is_set = false;
var el = $2 as expression_list;
if (el == null || el.Count == 0)
is_set = true;
else if (el.expressions.Count(x => x is diapason_expr_new) > 0)
is_set = true;
if (is_set)*/
if (is_set)
$$ = new pascal_set_constant($2 as expression_list, @$);
//else $$ = new array_const_new($2 as expression_list, @$);
else $$ = new array_const_new($2 as expression_list, @$);
}
;
@ -2781,10 +2781,6 @@ unlabelled_stmt
{ $$ = $1; }
| proc_call
{ $$ = $1; }
/*| pascal_set_const tkPoint identifier
{
$$ = new dot_node($1 as addressed_value, $3 as addressed_value, @$);
}*/
| goto_stmt
{ $$ = $1; }
| compound_stmt

View file

@ -2,7 +2,7 @@
// GPPG version 1.3.6
// Machine: LAPTOP-TE3HP881
// DateTime: 14.12.2024 20:15:40
// DateTime: 15.12.2024 8:40:16
// UserName: miks
// Input file <ABCPascal.y>
@ -3670,15 +3670,15 @@ public partial class GPPGParser: ShiftReduceParser<PascalABCCompiler.ParserTools
case 164: // pascal_set_const -> tkSquareOpen, elem_list, tkSquareClose
{
// <20>?сли elem_list п<>?с<>? или соде<D0B4>?жи<D0B6>? диапазон, <20>?о э<>?о множес<D0B5>?во, ина<D0BD>?е массив. С PascalABC.NET 3.10
/*var is_set = false;
var el = $2 as expression_list;
var is_set = false;
var el = ValueStack[ValueStack.Depth-2].stn as expression_list;
if (el == null || el.Count == 0)
is_set = true;
else if (el.expressions.Count(x => x is diapason_expr_new) > 0)
is_set = true;
if (is_set)*/
if (is_set)
CurrentSemanticValue.ex = new pascal_set_constant(ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan);
//else $$ = new array_const_new($2 as expression_list, @$);
else CurrentSemanticValue.ex = new array_const_new(ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan);
}
break;
case 165: // const_set -> pascal_set_const

View file

@ -389,5 +389,6 @@ script=

View file

@ -5233,7 +5233,7 @@ namespace PascalABCCompiler.TreeConverter
public override void visit(SyntaxTree.pascal_set_constant _pascal_set_constant)
{
// Если хоть одно - diapason_expr, то это множество иначе литеральный массив
if (_pascal_set_constant.values == null ||
/*if (_pascal_set_constant.values == null ||
_pascal_set_constant.values.expressions.Any(ex => ex is SyntaxTree.diapason_expr)
)
{ // это множество
@ -5244,7 +5244,7 @@ namespace PascalABCCompiler.TreeConverter
array_const_new ac = new array_const_new(exl,exl.source_context);
visit(ac);
return;
}
}*/
// надо разбить на 2 списка констант
expressions_list consts = new expressions_list();
expressions_list consts_diap = new expressions_list();