Различные ограничения на функции с параметром [Cache]
This commit is contained in:
parent
5865d3d431
commit
de55f99304
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "8";
|
||||
public const string Build = "0";
|
||||
public const string Revision = "2957";
|
||||
public const string Revision = "2959";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=8
|
||||
%REVISION%=2957
|
||||
%REVISION%=2959
|
||||
%COREVERSION%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
// This CSharp output file generated by Gardens Point LEX
|
||||
// Version: 1.1.3.301
|
||||
// Machine: DESKTOP-G8V08V4
|
||||
// DateTime: 07.08.2021 12:52:41
|
||||
// DateTime: 07.08.2021 13:52:51
|
||||
// UserName: ?????????
|
||||
// GPLEX input file <ABCPascal.lex>
|
||||
// GPLEX frame file <embedded resource>
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
// GPPG version 1.3.6
|
||||
// Machine: DESKTOP-G8V08V4
|
||||
// DateTime: 07.08.2021 12:52:41
|
||||
// DateTime: 07.08.2021 13:52:51
|
||||
// UserName: ?????????
|
||||
// Input file <ABCPascal.y>
|
||||
// Input file <D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y>
|
||||
|
||||
// options: no-lines gplex
|
||||
|
||||
|
|
@ -59,7 +59,7 @@ public abstract class ScanBase : AbstractScanner<PascalABCSavParser.Union,LexLoc
|
|||
|
||||
public partial class GPPGParser: ShiftReduceParser<PascalABCSavParser.Union, LexLocation>
|
||||
{
|
||||
// Verbatim content from ABCPascal.y
|
||||
// Verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y
|
||||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> GPPGParser, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gppg
|
||||
public syntax_tree_node root; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ public partial class GPPGParser: ShiftReduceParser<PascalABCSavParser.Union, Lex
|
|||
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
|
||||
|
||||
public GPPGParser(AbstractScanner<PascalABCSavParser.Union, LexLocation> scanner) : base(scanner) { }
|
||||
// End verbatim content from ABCPascal.y
|
||||
// End verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y
|
||||
|
||||
#pragma warning disable 649
|
||||
private static Dictionary<int, string> aliasses;
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.8.0.2957
|
||||
3.8.0.2959
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.8.0.2957'
|
||||
!define VERSION '3.8.0.2959'
|
||||
|
|
|
|||
|
|
@ -2086,4 +2086,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
public bool IsDataClass { get ; set; }
|
||||
}
|
||||
|
||||
public class semantic_check_delegates_pointers_in_cached_function // класс - маркер семантической проверки
|
||||
{ }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,6 +79,8 @@ namespace PascalABCCompiler.SyntaxTreeConverters
|
|||
MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root);
|
||||
ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);
|
||||
|
||||
CacheFunctionVisitor.New.ProcessNode(root);
|
||||
|
||||
#if DEBUG
|
||||
//new SimplePrettyPrinterVisitor("D:\\Tree.txt").ProcessNode(root);
|
||||
//FillParentNodeVisitor.New.ProcessNode(root);
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
<Compile Include="AllVarsInProcYieldsProba.cs" />
|
||||
<Compile Include="BaseVisitors\CollectNamespaces.cs" />
|
||||
<Compile Include="BaseVisitors\HasStatementVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\CacheFunctionVisitor.cs" />
|
||||
<Compile Include="SugarVisitors\UnpackLambdaParametersVisitor.cs" />
|
||||
<Compile Include="UniversalVisitors\ABCStatisticsVisitors.cs" />
|
||||
<Compile Include="BaseVisitors\SmallHelperVisitors.cs" />
|
||||
|
|
|
|||
|
|
@ -267,6 +267,12 @@ type
|
|||
/// Представляет тип короткой строки фиксированной длины 255 символов
|
||||
ShortString = string[255];
|
||||
|
||||
// Атрибут для кеширования результатов функции
|
||||
CacheAttribute = class(System.Attribute)
|
||||
public constructor Create;
|
||||
begin end;
|
||||
end;
|
||||
|
||||
//{{{--doc: Конец секции стандартных типов для документации }}}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -21111,6 +21111,20 @@ namespace PascalABCCompiler.TreeConverter
|
|||
var mc = st.lst[2] as method_call;
|
||||
semantic_check_slice_assignment_types(to, from, mc);
|
||||
}
|
||||
else if (st.typ as System.Type == typeof(semantic_check_delegates_pointers_in_cached_function))
|
||||
{
|
||||
var parameters = st.lst[0] as formal_parameters;
|
||||
var types = parameters.params_list.Select(p => p.vars_type);
|
||||
foreach (var tp in types)
|
||||
{
|
||||
var sem_type = convert_strong(tp);
|
||||
if (sem_type.IsDelegate)
|
||||
{
|
||||
AddError(sem_type.location, "FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_DELEGATES_AS_PARAMETERS");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// !Slices
|
||||
else
|
||||
{
|
||||
|
|
@ -21137,11 +21151,19 @@ namespace PascalABCCompiler.TreeConverter
|
|||
|
||||
public override void visit(SyntaxTree.sugared_expression ex)
|
||||
{
|
||||
/*if (ex.sugared_expr is SyntaxTree.tuple_node)
|
||||
if (ex.sugared_expr is SyntaxTree.template_param_list tpl) // это в [Cache]
|
||||
{
|
||||
semantic_check_tuple(ex.sugared_expr as SyntaxTree.tuple_node);
|
||||
foreach (var tp in tpl.params_list)
|
||||
{
|
||||
var sem_type = convert_strong(tp);
|
||||
if (sem_type.IsPointer)
|
||||
{
|
||||
AddError(sem_type.location, "FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_POINTERS_AS_PARAMETERS");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else*/
|
||||
else
|
||||
{
|
||||
AddError(get_location(ex), "MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}", ex.sugared_expr.GetType().Name);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -267,6 +267,12 @@ type
|
|||
/// Представляет тип короткой строки фиксированной длины 255 символов
|
||||
ShortString = string[255];
|
||||
|
||||
// Атрибут для кеширования результатов функции
|
||||
CacheAttribute = class(System.Attribute)
|
||||
public constructor Create;
|
||||
begin end;
|
||||
end;
|
||||
|
||||
//{{{--doc: Конец секции стандартных типов для документации }}}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -48,4 +48,6 @@ MEMBER_{0}_OF_TYPE_{1}_CANNOT_BE_FOUND_IN_THE_CONTEEXT_OF_FUNCTION_WITH_YIELD=Na
|
|||
UNCOMPARABLE_TYPES_IN_ARRAY_CONST=Uncomparable types in array initializers
|
||||
IMPOSSIBLE_TO_CONVERT_ARRAY_CONST_TO_{0}=It is impossible to convert array initializer to type {0}
|
||||
SLICES_MULTI_DIMENSIONAL_ARRAY_EXPECTED=Multidimensional slices are allowed for multidimensional arrays only
|
||||
NUMBER_OF_SLICES_IN_MULTIDIMENSIONAL_ARRAY_SHOULD_BE_EQUAL_TO_ARRAY_RANK=Number of slices in multidimensional array should be equal to the array rank
|
||||
NUMBER_OF_SLICES_IN_MULTIDIMENSIONAL_ARRAY_SHOULD_BE_EQUAL_TO_ARRAY_RANK=Number of slices in multidimensional array should be equal to the array rank
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_DELEGATES_AS_PARAMETERS=Functions with [Cache] attribute should not have delegate parameters
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_POINTERS_AS_PARAMETERS=Functions with [Cache] attribute should not have pointer parameters
|
||||
|
|
@ -37,4 +37,13 @@ NESTED_RECORD_CANNOT_CONTAIN_SEVERAL_VISIBILITY_SECTIONS=Nested records can not
|
|||
UNNAMED_RECORD_CANNOT_CATCH_NAMES_FROM_NONGLOBAL_CONTEXT=Nested records cannot catch names from nonglobal context
|
||||
TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMENT=Too many elements on the left side of tuple assignment
|
||||
NESTED_LAMBDAS_MAXIMUM_10=Maximum number of nested lambdas = 10
|
||||
EMBEDDED_STATEMENT_CANNOT_BE_A_DECLARATION=Embedded statement cannot be a declaration or labeled statement
|
||||
EMBEDDED_STATEMENT_CANNOT_BE_A_DECLARATION=Embedded statement cannot be a declaration or labeled statement
|
||||
|
||||
ONLY_FUNCTION_SHOULD_HAVE_CACHE_ATTRIBUTE=Only functions must have [Cache] attribute
|
||||
EXTENSION_FUNCTIONS_SHOULD_NOT_HAVE_CACHE_ATTRIBUTE=Extension methods shouldn't have [Cache] attribute
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_HAVE_PARAMETERS=Functions with [Cache] attribute must have at least 1 parameter
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_HAVE_LESSTHEN8_PARAMETERS=Functions with [Cache] attribute must have less then 8 parameters
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_HAVE_EXPLICIT_RETURN_TYPE=Functions with [Cache] attribute must have explicitely specified return type
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_COMPOUND_NAME=Functions with [Cache] should not have compound name
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_VAR_CONST_PARAMS_MODIFIERS=Functions with [Cache] should not have var, const or params modifier
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_BE_DEFINED_GLOBALLY=Functions with [Cache] attribute must be defined globally
|
||||
|
|
@ -48,4 +48,6 @@ MEMBER_{0}_OF_TYPE_{1}_CANNOT_BE_FOUND_IN_THE_CONTEEXT_OF_FUNCTION_WITH_YIELD=И
|
|||
UNCOMPARABLE_TYPES_IN_ARRAY_CONST=Несовместимые типы при задании массива
|
||||
IMPOSSIBLE_TO_CONVERT_ARRAY_CONST_TO_{0}=Невозможно преобразовать инициализатор массива к типу {0}
|
||||
SLICES_MULTI_DIMENSIONAL_ARRAY_EXPECTED=Многмерные срезы доступны только для многомерных массивов
|
||||
NUMBER_OF_SLICES_IN_MULTIDIMENSIONAL_ARRAY_SHOULD_BE_EQUAL_TO_ARRAY_RANK=Количество срезов или индексов многомерного массива должно совпадать с количеством размерностей этого массива
|
||||
NUMBER_OF_SLICES_IN_MULTIDIMENSIONAL_ARRAY_SHOULD_BE_EQUAL_TO_ARRAY_RANK=Количество срезов или индексов многомерного массива должно совпадать с количеством размерностей этого массива
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_DELEGATES_AS_PARAMETERS=Функции, помеченные атрибутом [Cache], не должны содержать параметры-делегаты
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_POINTERS_AS_PARAMETERS=Функции, помеченные атрибутом [Cache], не должны содержать параметры-указатели
|
||||
|
|
@ -41,4 +41,13 @@ NESTED_RECORD_CANNOT_CONTAIN_SEVERAL_VISIBILITY_SECTIONS=Вложенные за
|
|||
NESTED_RECORD_CANNOT_CATCH_NAMES_FROM_NONGLOBAL_CONTEXT=Вложенные записи не могут захватывать имена из неглобального контекста
|
||||
TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMENT=Слишком много элементов в левой части при присваивании кортежа
|
||||
NESTED_LAMBDAS_MAXIMUM_10=Максимальный уровень вложенности лямбд равен 10
|
||||
EMBEDDED_STATEMENT_CANNOT_BE_A_DECLARATION=Вложенная инструкция не может быть объявлением, используйте операторные скобки
|
||||
EMBEDDED_STATEMENT_CANNOT_BE_A_DECLARATION=Вложенная инструкция не может быть объявлением, используйте операторные скобки
|
||||
|
||||
ONLY_FUNCTION_SHOULD_HAVE_CACHE_ATTRIBUTE=Только функции могут иметь атрибут [Cache]
|
||||
EXTENSION_FUNCTIONS_SHOULD_NOT_HAVE_CACHE_ATTRIBUTE=Методы расширения не могут иметь атрибут [Cache]
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_HAVE_PARAMETERS=Функции с атрибутом [Cache] должны иметь хотя бы 1 параметр
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_HAVE_LESSTHEN8_PARAMETERS=Функции с атрибутом [Cache] должны иметь не более 7 параметров
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_HAVE_EXPLICIT_RETURN_TYPE=Функции с атрибутом [Cache] должны иметь явно указанный возвращаемый тип
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_COMPOUND_NAME=Функции с атрибутом [Cache] не должны иметь составное имя
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_NOT_HAVE_VAR_CONST_PARAMS_MODIFIERS=Функции с атрибутом [Cache] не должны иметь var, const и params-параметры
|
||||
FUNCTIONS_WITH_CACHE_ATTRIBUTE_SHOULD_BE_DEFINED_GLOBALLY=Функции с атрибутом [Cache] должны быть определены глобально
|
||||
Loading…
Reference in a new issue