Различные ограничения на функции с параметром [Cache]

This commit is contained in:
Mikhalkovich Stanislav 2021-08-09 22:37:53 +03:00
parent 5865d3d431
commit de55f99304
16 changed files with 77 additions and 16 deletions

View file

@ -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;

View file

@ -1,4 +1,4 @@
%MINOR%=8
%REVISION%=2957
%REVISION%=2959
%COREVERSION%=0
%MAJOR%=3

View file

@ -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>

View file

@ -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;

View file

@ -1 +1 @@
3.8.0.2957
3.8.0.2959

View file

@ -1 +1 @@
!define VERSION '3.8.0.2957'
!define VERSION '3.8.0.2959'

View file

@ -2086,4 +2086,6 @@ namespace PascalABCCompiler.SyntaxTree
public bool IsDataClass { get ; set; }
}
public class semantic_check_delegates_pointers_in_cached_function // класс - маркер семантической проверки
{ }
}

View file

@ -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);

View file

@ -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" />

View file

@ -267,6 +267,12 @@ type
/// Представляет тип короткой строки фиксированной длины 255 символов
ShortString = string[255];
// Атрибут для кеширования результатов функции
CacheAttribute = class(System.Attribute)
public constructor Create;
begin end;
end;
//{{{--doc: Конец секции стандартных типов для документации }}}
//------------------------------------------------------------------------------

View file

@ -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);
}

View file

@ -267,6 +267,12 @@ type
/// Представляет тип короткой строки фиксированной длины 255 символов
ShortString = string[255];
// Атрибут для кеширования результатов функции
CacheAttribute = class(System.Attribute)
public constructor Create;
begin end;
end;
//{{{--doc: Конец секции стандартных типов для документации }}}
//------------------------------------------------------------------------------

View file

@ -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

View file

@ -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

View file

@ -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], не должны содержать параметры-указатели

View file

@ -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] должны быть определены глобально