refactoring in semantic (#3433)

This commit is contained in:
samuraiGH 2026-06-30 00:11:27 +03:00 committed by GitHub
parent f70abef278
commit 7c31caa0b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 14 deletions

View file

@ -398,11 +398,11 @@ namespace PascalABCCompiler.NETGenerator
} }
} }
private ICommonFunctionNode GetGenericFunctionContainer(ITypeNode tn) private IFunctionNode GetGenericFunctionContainer(ITypeNode tn)
{ {
if (tn.common_generic_function_container != null) if (tn.generic_function_container != null)
{ {
return tn.common_generic_function_container; return tn.generic_function_container;
} }
if (tn.type_special_kind == type_special_kind.typed_file) if (tn.type_special_kind == type_special_kind.typed_file)
{ {
@ -426,7 +426,7 @@ namespace PascalABCCompiler.NETGenerator
{ {
foreach (ITypeNode par in igti.generic_parameters) foreach (ITypeNode par in igti.generic_parameters)
{ {
ICommonFunctionNode rez = GetGenericFunctionContainer(par); IFunctionNode rez = GetGenericFunctionContainer(par);
if (rez != null) if (rez != null)
{ {
return rez; return rez;
@ -2535,7 +2535,7 @@ namespace PascalABCCompiler.NETGenerator
TypeInfo tinfo = helper.GetTypeReference(itn); TypeInfo tinfo = helper.GetTypeReference(itn);
if (tinfo == null) if (tinfo == null)
{ {
AddTypeInstanceToFunction(GetGenericFunctionContainer(value), igtn); AddTypeInstanceToFunction((ICommonFunctionNode)GetGenericFunctionContainer(value), igtn);
return; return;
} }
iparams.Add(tinfo.tp); iparams.Add(tinfo.tp);

View file

@ -242,12 +242,12 @@ namespace PascalABCCompiler.SemanticTree
} }
//Описание generic-типа, содержащее данный параметр //Описание generic-типа, содержащее данный параметр
ICommonTypeNode generic_type_container ITypeNode generic_type_container
{ {
get; get;
} }
ICommonFunctionNode common_generic_function_container IFunctionNode generic_function_container
{ {
get; get;
} }

View file

@ -1,7 +1,6 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
@ -143,7 +142,7 @@ namespace PascalABCCompiler.TreeRealization
} }
} }
public virtual SemanticTree.ICommonTypeNode generic_type_container public virtual SemanticTree.ITypeNode generic_type_container
{ {
get get
{ {
@ -165,11 +164,11 @@ namespace PascalABCCompiler.TreeRealization
} }
} }
SemanticTree.ICommonFunctionNode SemanticTree.ITypeNode.common_generic_function_container SemanticTree.IFunctionNode SemanticTree.ITypeNode.generic_function_container
{ {
get get
{ {
return generic_function_container as SemanticTree.ICommonFunctionNode; return generic_function_container;
} }
} }
@ -1434,7 +1433,7 @@ namespace PascalABCCompiler.TreeRealization
private SemanticTree.ICommonTypeNode _generic_type_container = null; private SemanticTree.ICommonTypeNode _generic_type_container = null;
public override SemanticTree.ICommonTypeNode generic_type_container public override SemanticTree.ITypeNode generic_type_container
{ {
get get
{ {
@ -1442,7 +1441,7 @@ namespace PascalABCCompiler.TreeRealization
} }
set set
{ {
_generic_type_container = value; _generic_type_container = (SemanticTree.ICommonTypeNode)value;
} }
} }
@ -1465,7 +1464,7 @@ namespace PascalABCCompiler.TreeRealization
{ {
if (_generic_type_container != null) if (_generic_type_container != null)
{ {
return generic_type_container.generic_params.IndexOf(this); return _generic_type_container.generic_params.IndexOf(this);
} }
else else
{ {
@ -3024,6 +3023,22 @@ namespace PascalABCCompiler.TreeRealization
} }
} }
public override SemanticTree.ITypeNode generic_type_container
{
get
{
if (!_compiled_type.IsGenericParameter || _compiled_type.DeclaringMethod == null)
{
return null;
}
return get_type_node(_compiled_type.DeclaringType);
}
set
{
throw new NotSupportedException();
}
}
public override bool is_generic_type_definition public override bool is_generic_type_definition
{ {
get get