SymTable refactoring
This commit is contained in:
parent
8c70f44b94
commit
8a6506e73e
|
|
@ -467,9 +467,14 @@ namespace PascalABCCompiler.PCU
|
|||
{
|
||||
//PCUReturner.AddPCUReader((wrapped_definition_node)si.sym_info, this);
|
||||
//si.access_level = access_level.al_public;
|
||||
SymbolInfo si2 = (cun.scope as WrappedUnitInterfaceScope).FindWithoutCreation(names[i].name);
|
||||
SymbolInfo si2;
|
||||
var temp = (cun.scope as WrappedUnitInterfaceScope).FindWithoutCreation(names[i].name);
|
||||
if (temp != null)
|
||||
si2 = temp.ToSymbolInfo();
|
||||
else
|
||||
si2 = null;
|
||||
si.Next = si2;
|
||||
Scope.AddSymbol(names[i].name, si);
|
||||
Scope.AddSymbol(names[i].name, new SymbolInfoUnit(si));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -479,17 +484,12 @@ namespace PascalABCCompiler.PCU
|
|||
{
|
||||
if ((tn as compiled_type_node).scope == null)
|
||||
(tn as compiled_type_node).init_scope();
|
||||
(tn as compiled_type_node).scope.AddSymbol(names[i].name, si);
|
||||
(tn as compiled_type_node).scope.AddSymbol(names[i].name, new SymbolInfoUnit(si));
|
||||
}
|
||||
else if (tn is generic_instance_type_node)
|
||||
tn.Scope.AddSymbol(names[i].name, si);
|
||||
tn.Scope.AddSymbol(names[i].name, new SymbolInfoUnit(si));
|
||||
else if (tn is common_type_node)
|
||||
{
|
||||
(tn as common_type_node).scope.AddSymbol(names[i].name, si);
|
||||
if (tn.IsDelegate)
|
||||
SystemLibrary.SystemLibrary.system_delegate_type.Scope.AddSymbol(names[i].name, si);
|
||||
}
|
||||
|
||||
(tn as common_type_node).scope.AddSymbol(names[i].name, new SymbolInfoUnit(si));
|
||||
else
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
|
@ -2226,10 +2226,10 @@ namespace PascalABCCompiler.PCU
|
|||
|
||||
if (type_is_delegate)
|
||||
{
|
||||
SymbolInfo sim = ctn.find_in_type(compiler_string_consts.invoke_method_name);
|
||||
common_method_node invoke_method = sim.sym_info as common_method_node;
|
||||
SymbolInfoList sim = ctn.find_in_type(compiler_string_consts.invoke_method_name);
|
||||
common_method_node invoke_method = sim.First().sym_info as common_method_node;
|
||||
sim = ctn.find_in_type(compiler_string_consts.default_constructor_name);
|
||||
common_method_node constructor = sim.sym_info as common_method_node;
|
||||
common_method_node constructor = sim.First().sym_info as common_method_node;
|
||||
delegate_internal_interface dii = new delegate_internal_interface(invoke_method.return_value_type, invoke_method, constructor);
|
||||
dii.parameters.AddRange(invoke_method.parameters);
|
||||
ctn.add_internal_interface(dii);
|
||||
|
|
@ -2252,10 +2252,10 @@ namespace PascalABCCompiler.PCU
|
|||
{
|
||||
foreach (common_type_node par in ctn.generic_params)
|
||||
{
|
||||
SymbolInfo tsi = ctn.find_in_type(compiler_string_consts.generic_param_kind_prefix + par.name);
|
||||
SymbolInfoList tsi = ctn.find_in_type(compiler_string_consts.generic_param_kind_prefix + par.name);
|
||||
if (tsi != null)
|
||||
{
|
||||
par.runtime_initialization_marker = tsi.sym_info as class_field;
|
||||
par.runtime_initialization_marker = tsi.First().sym_info as class_field;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2402,7 +2402,7 @@ namespace PascalABCCompiler.PCU
|
|||
//members[offset] = tc;
|
||||
AddMember(tc, offset);
|
||||
|
||||
cun.namespaces[0].scope.AddSymbol(name, new SymbolInfo(tc));
|
||||
cun.namespaces[0].scope.AddSymbol(name, new SymbolInfoUnit(tc));
|
||||
|
||||
return tc;
|
||||
}
|
||||
|
|
@ -2446,7 +2446,7 @@ namespace PascalABCCompiler.PCU
|
|||
wrapped_type_synonym wts = CreateTypeSynonym();
|
||||
SymbolInfo si = new SymbolInfo();
|
||||
si.sym_info = wts;
|
||||
scope.AddSymbol(wts.name, si);
|
||||
scope.AddSymbol(wts.name, new SymbolInfoUnit(si));
|
||||
}
|
||||
br.BaseStream.Seek(pos, SeekOrigin.Begin);
|
||||
}
|
||||
|
|
@ -2563,7 +2563,7 @@ namespace PascalABCCompiler.PCU
|
|||
//Вроде это ненужно
|
||||
//SymbolInfo si2 = scope.FindWithoutCreation(name);
|
||||
//si.Next = si2;
|
||||
scope.AddSymbol(name, si);
|
||||
scope.AddSymbol(name, new SymbolInfoUnit(si));
|
||||
names[i] = name;
|
||||
}
|
||||
return names;
|
||||
|
|
@ -2807,19 +2807,13 @@ namespace PascalABCCompiler.PCU
|
|||
int_members.Add(cnfn);
|
||||
cnfn.ConnectedToType = ConnectedToType;
|
||||
if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.type_special_kind == SemanticTree.type_special_kind.array_kind && cnfn.ConnectedToType.element_type.is_generic_parameter)
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.is_generic_parameter)
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
else if (cnfn.ConnectedToType is compiled_generic_instance_type_node && cnfn.ConnectedToType.original_generic.Scope != null)
|
||||
{
|
||||
cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.IsDelegate && cnfn.ConnectedToType.base_type.IsDelegate)
|
||||
compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
}
|
||||
cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.IsDelegate && cnfn.ConnectedToType.base_type.IsDelegate)
|
||||
compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.type_special_kind == SemanticTree.type_special_kind.typed_file && cnfn.ConnectedToType.element_type.is_generic_parameter && SystemLibrary.SystemLibInitializer.TypedFileType.sym_info != null)
|
||||
(SystemLibrary.SystemLibInitializer.TypedFileType.sym_info as type_node).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
return cnfn;
|
||||
}
|
||||
|
||||
|
|
@ -2908,27 +2902,15 @@ namespace PascalABCCompiler.PCU
|
|||
for (int i=0; i<num_nest_funcs; i++)
|
||||
cnfn.functions_nodes_list.AddElement(GetNestedFunction());
|
||||
//br.ReadInt32();//code;
|
||||
if (cnfn.name == "*")
|
||||
{
|
||||
|
||||
}
|
||||
cnfn.loc = ReadDebugInfo();
|
||||
cnfn.function_code = (restore_code /*|| cnfn.is_generic_function*/) ? GetCode(br.ReadInt32()) : new wrapped_function_body(this, br.ReadInt32());
|
||||
cnfn.ConnectedToType = ConnectedToType;
|
||||
if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.type_special_kind == SemanticTree.type_special_kind.array_kind && cnfn.ConnectedToType.element_type.is_generic_parameter)
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.is_generic_parameter)
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
else if (cnfn.ConnectedToType is compiled_generic_instance_type_node && cnfn.ConnectedToType.original_generic.Scope != null)
|
||||
{
|
||||
cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.IsDelegate && cnfn.ConnectedToType.base_type.IsDelegate)
|
||||
compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
}
|
||||
else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.IsDelegate && cnfn.ConnectedToType.base_type.IsDelegate)
|
||||
compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.type_special_kind == SemanticTree.type_special_kind.typed_file && (cnfn.ConnectedToType.element_type == null || cnfn.ConnectedToType.element_type.is_generic_parameter) && SystemLibrary.SystemLibInitializer.TypedFileType.sym_info != null)
|
||||
(SystemLibrary.SystemLibInitializer.TypedFileType.sym_info as type_node).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn));
|
||||
cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfoUnit(cnfn));
|
||||
br.BaseStream.Seek(pos,SeekOrigin.Begin);
|
||||
return cnfn;
|
||||
}
|
||||
|
|
@ -3319,35 +3301,15 @@ namespace PascalABCCompiler.PCU
|
|||
type_node tn = GetTypeReference();
|
||||
expression_node initv = null;
|
||||
local_block_variable lv = new local_block_variable(name, tn, stmt, null);
|
||||
if (members.ContainsKey(offset))
|
||||
{
|
||||
lv = members[offset] as local_block_variable;
|
||||
if (CanReadObject())
|
||||
br.ReadInt32();
|
||||
ReadDebugInfo();
|
||||
}
|
||||
else
|
||||
{
|
||||
AddMember(lv, offset);
|
||||
if (CanReadObject())
|
||||
initv = CreateExpressionWithOffset();
|
||||
lv.loc = ReadDebugInfo();
|
||||
lv.inital_value = initv;
|
||||
}
|
||||
|
||||
AddMember(lv, offset);
|
||||
if (CanReadObject())
|
||||
initv = CreateExpressionWithOffset();
|
||||
lv.loc = ReadDebugInfo();
|
||||
lv.inital_value = initv;
|
||||
return lv;
|
||||
|
||||
}
|
||||
|
||||
public expression_node GetExpression(int offset)
|
||||
{
|
||||
int tmp = (int)br.BaseStream.Position;
|
||||
br.BaseStream.Seek(offset, SeekOrigin.Begin);
|
||||
expression_node expr = CreateExpressionWithOffset();
|
||||
br.BaseStream.Seek(tmp, SeekOrigin.Begin);
|
||||
return expr;
|
||||
}
|
||||
|
||||
private statement_node CreateEmpty()
|
||||
{
|
||||
return new empty_statement(null);
|
||||
|
|
@ -3977,13 +3939,6 @@ namespace PascalABCCompiler.PCU
|
|||
|
||||
private local_block_variable GetLocalBlockVariableByOffset(int offset)
|
||||
{
|
||||
if (!members.ContainsKey(offset))
|
||||
{
|
||||
int tmp = (int)br.BaseStream.Position;
|
||||
br.BaseStream.Seek(start_pos + offset, SeekOrigin.Begin);
|
||||
var loc_var = CreateLocalBlockVariable(null);
|
||||
br.BaseStream.Seek(tmp, SeekOrigin.Begin);
|
||||
}
|
||||
return (local_block_variable)members[offset];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,12 +36,11 @@ namespace PascalABCCompiler.PCU
|
|||
this.pr = pr;
|
||||
}
|
||||
|
||||
public override SymbolInfo Find(string name)
|
||||
public override SymbolInfoList Find(string name)
|
||||
{
|
||||
SymbolInfo si = SymbolTable.Find(this, name);
|
||||
if (si == null) return si;
|
||||
SymbolInfo tsi=si;
|
||||
while (tsi != null)
|
||||
SymbolInfoList si = SymbolTable.Find(this, name);
|
||||
if (si == null) return null;
|
||||
foreach(SymbolInfoUnit tsi in si.InfoUnitList)
|
||||
{
|
||||
if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
|
||||
{
|
||||
|
|
@ -51,33 +50,31 @@ namespace PascalABCCompiler.PCU
|
|||
else
|
||||
tsi.sym_info = wdn.PCUReader.CreateInterfaceMember(wdn.offset, name);
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
public override SymbolInfo FindOnlyInScope(string name)
|
||||
public override SymbolInfoList FindOnlyInScope(string name)
|
||||
{
|
||||
SymbolInfo si = SymbolTable.FindOnlyInScope(this, name, false);
|
||||
SymbolInfoList si = SymbolTable.FindOnlyInScope(this, name, false);
|
||||
|
||||
if (si == null) return si;
|
||||
SymbolInfo tsi = si;
|
||||
while (tsi != null)
|
||||
foreach(SymbolInfoUnit tsi in si.InfoUnitList)
|
||||
{
|
||||
if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
|
||||
{
|
||||
wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
|
||||
if (wdn.is_synonim)
|
||||
tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
|
||||
tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
|
||||
else
|
||||
tsi.sym_info = wdn.PCUReader.CreateInterfaceMember(wdn.offset,name);
|
||||
tsi.sym_info = wdn.PCUReader.CreateInterfaceMember(wdn.offset, name);
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
//нужно для перегруженных методов
|
||||
public SymbolInfo FindWithoutCreation(string name)
|
||||
public SymbolInfoList FindWithoutCreation(string name)
|
||||
{
|
||||
return SymbolTable.FindOnlyInType(this, name);
|
||||
}
|
||||
|
|
@ -94,12 +91,11 @@ namespace PascalABCCompiler.PCU
|
|||
this.pr = pr;
|
||||
}
|
||||
|
||||
public override SymbolInfo Find(string name)
|
||||
public override SymbolInfoList Find(string name)
|
||||
{
|
||||
SymbolInfo si = SymbolTable.Find(this, name);
|
||||
if (si == null) return si;
|
||||
SymbolInfo tsi = si;
|
||||
while (tsi != null)
|
||||
SymbolInfoList si = SymbolTable.Find(this, name);
|
||||
if (si == null) return null;
|
||||
foreach(SymbolInfoUnit tsi in si.InfoUnitList)
|
||||
{
|
||||
if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
|
||||
{
|
||||
|
|
@ -109,33 +105,31 @@ namespace PascalABCCompiler.PCU
|
|||
else
|
||||
tsi.sym_info = wdn.PCUReader.CreateImplementationMember(wdn.offset);
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
public override SymbolInfo FindOnlyInScope(string name)
|
||||
public override SymbolInfoList FindOnlyInScope(string name)
|
||||
{
|
||||
SymbolInfo si = SymbolTable.FindOnlyInScope(this, name, false);
|
||||
SymbolInfoList si = SymbolTable.FindOnlyInScope(this, name, false);
|
||||
|
||||
if (si == null) return si;
|
||||
SymbolInfo tsi = si;
|
||||
while (tsi != null)
|
||||
foreach(SymbolInfoUnit tsi in si.InfoUnitList)
|
||||
{
|
||||
if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
|
||||
{
|
||||
wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
|
||||
if (wdn.is_synonim)
|
||||
tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
|
||||
tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
|
||||
else
|
||||
tsi.sym_info = wdn.PCUReader.CreateImplementationMember(wdn.offset);
|
||||
tsi.sym_info = wdn.PCUReader.CreateImplementationMember(wdn.offset);
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
//нужно для перегруженных методов
|
||||
public SymbolInfo FindWithoutCreation(string name)
|
||||
public SymbolInfoList FindWithoutCreation(string name)
|
||||
{
|
||||
return SymbolTable.FindOnlyInType(this, name);
|
||||
}
|
||||
|
|
@ -153,45 +147,40 @@ namespace PascalABCCompiler.PCU
|
|||
this.pr = pr;
|
||||
}
|
||||
|
||||
public override SymbolInfo Find(string name)
|
||||
public override SymbolInfoList Find(string name)
|
||||
{
|
||||
SymbolInfo si = SymbolTable.Find(this, name);
|
||||
SymbolInfoList si = SymbolTable.Find(this, name);
|
||||
if (PartialScope != null)
|
||||
{
|
||||
if (si == null)
|
||||
si = SymbolTable.Find(PartialScope, name);
|
||||
else
|
||||
{
|
||||
SymbolInfo tmp_si = si;
|
||||
while (tmp_si.Next != null)
|
||||
tmp_si = tmp_si.Next;
|
||||
tmp_si.Next = SymbolTable.Find(PartialScope, name);
|
||||
si.Add(SymbolTable.Find(PartialScope, name));
|
||||
}
|
||||
}
|
||||
if (si == null) return si;
|
||||
if (si == null) return null;
|
||||
//если это заглушка, то разворачиваем сущность
|
||||
SymbolInfo tsi=si;
|
||||
while (tsi != null)
|
||||
foreach (SymbolInfoUnit tsi in si.InfoUnitList)
|
||||
{
|
||||
if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
|
||||
{
|
||||
wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
|
||||
tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
public void RestoreMembers(string name)
|
||||
{
|
||||
SymbolInfo tsi = SymbolTable.FindOnlyInThisClass(this, name);
|
||||
SymbolInfoList si = SymbolTable.FindOnlyInThisClass(this, name);
|
||||
//если это заглушка, то разворачиваем сущность
|
||||
while (tsi != null)
|
||||
foreach(SymbolInfoUnit tsi in si.InfoUnitList)
|
||||
{
|
||||
if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
|
||||
{
|
||||
PCUSymbolInfo pcu_tsi = tsi as PCUSymbolInfo;
|
||||
PCUSymbolInfo pcu_tsi = tsi.ToSymbolInfo() as PCUSymbolInfo;
|
||||
if (!(pcu_tsi != null && pcu_tsi.semantic_node_type == semantic_node_type.common_method_node && !pcu_tsi.virtual_slot) || pr.comp.CompilerOptions.OutputFileType == CompilerOptions.OutputType.ClassLibrary)
|
||||
{
|
||||
wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
|
||||
|
|
@ -202,18 +191,17 @@ namespace PascalABCCompiler.PCU
|
|||
|
||||
}
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
}
|
||||
|
||||
public override SymbolInfo Find(string name, Scope CurrentScope)
|
||||
public override SymbolInfoList Find(string name, Scope CurrentScope)
|
||||
{
|
||||
return Find(name);
|
||||
}
|
||||
|
||||
public SymbolInfo FindWithoutCreation(string name)
|
||||
public SymbolInfoList FindWithoutCreation(string name)
|
||||
{
|
||||
return SymbolTable.FindOnlyInScope(this,name, false);
|
||||
return SymbolTable.FindOnlyInScope(this, name, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -261,32 +249,6 @@ namespace PascalABCCompiler.PCU
|
|||
}
|
||||
}
|
||||
|
||||
public class wrapped_expression : expression_node
|
||||
{
|
||||
private PCUReader pr;
|
||||
|
||||
public int offset;
|
||||
|
||||
public wrapped_expression(PCUReader pr, int offset)
|
||||
{
|
||||
this.pr = pr;
|
||||
this.offset = offset;
|
||||
}
|
||||
|
||||
public override semantic_node_type semantic_node_type
|
||||
{
|
||||
get
|
||||
{
|
||||
return semantic_node_type.wrapped_expression;
|
||||
}
|
||||
}
|
||||
|
||||
public expression_node restore()
|
||||
{
|
||||
return pr.GetExpression(offset);
|
||||
}
|
||||
}
|
||||
|
||||
public class wrapped_function_body : wrapped_statement
|
||||
{
|
||||
private PCUReader pr;
|
||||
|
|
@ -320,20 +282,22 @@ namespace PascalABCCompiler.PCU
|
|||
this.offset = offset;
|
||||
}
|
||||
|
||||
public override SymbolInfo find_in_type(string name, bool no_search_in_extension_methods = false)
|
||||
public override SymbolInfoList find_in_type(string name, bool no_search_in_extension_methods = false)
|
||||
{
|
||||
return find_in_type(name, null, no_search_in_extension_methods);
|
||||
var temp = find_in_type(name, null, no_search_in_extension_methods);
|
||||
if (temp != null)
|
||||
return new SymbolInfoList(temp);
|
||||
return null;
|
||||
}
|
||||
public override SymbolInfo find_in_type(string name, Scope CurrentScope, bool no_search_in_extension_methods = false)
|
||||
{
|
||||
SymbolInfo si = scope.FindOnlyInType(name, CurrentScope);
|
||||
if (si == null)
|
||||
{
|
||||
if (base_type != null && base_type.IsDelegate)
|
||||
return base_type.find_in_type(name, CurrentScope, no_search_in_extension_methods);
|
||||
return si;
|
||||
}
|
||||
|
||||
SymbolInfo si;
|
||||
var temp = scope.FindOnlyInType(name, CurrentScope);
|
||||
if (temp != null)
|
||||
si = temp.ToSymbolInfo();
|
||||
else
|
||||
si = null;
|
||||
if (si == null) return si;
|
||||
SymbolInfo tsi = si;
|
||||
while (tsi != null)
|
||||
{
|
||||
|
|
@ -341,7 +305,6 @@ namespace PascalABCCompiler.PCU
|
|||
{
|
||||
wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
|
||||
tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
|
||||
|
||||
}
|
||||
tsi = tsi.Next;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ namespace TreeConverter.LambdaExpressions.Closure
|
|||
pn.internal_get_function = readFunction;
|
||||
pn.internal_set_function = writeFunction;
|
||||
|
||||
_visitor.context._ctn.Scope.AddSymbol(name, new SymbolInfo(pn));
|
||||
_visitor.context._ctn.Scope.AddSymbol(name, new SymbolInfoUnit(pn));
|
||||
_visitor.context._ctn.properties.AddElement(pn);
|
||||
}
|
||||
}
|
||||
|
|
@ -332,8 +332,6 @@ namespace TreeConverter.LambdaExpressions.Closure
|
|||
else
|
||||
{
|
||||
var si = forScope.SymbolInfoLoopVar;
|
||||
if (!_capturedVarsTreeNodesDictionary.ContainsKey(si.scope.ScopeNum))
|
||||
return;
|
||||
var scopeWhereVarDefined = _capturedVarsTreeNodesDictionary[si.scope.ScopeNum];
|
||||
var idRef = scopeWhereVarDefined
|
||||
.VariablesDefinedInScope
|
||||
|
|
|
|||
|
|
@ -127,8 +127,8 @@ namespace PascalABCCompiler.NetHelper
|
|||
_unar = value;
|
||||
}
|
||||
}
|
||||
|
||||
/*public override base_scope top_scope
|
||||
|
||||
/*public override base_scope top_scope
|
||||
{
|
||||
get
|
||||
{
|
||||
|
|
@ -136,14 +136,14 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
}*/
|
||||
|
||||
public override SymbolInfo Find(string name, SymbolTable.Scope CurrentScope)
|
||||
{
|
||||
SymbolInfo si=null;
|
||||
string full_ns=null;
|
||||
public override SymbolInfoList Find(string name, SymbolTable.Scope CurrentScope)
|
||||
{
|
||||
SymbolInfoList si = null;
|
||||
string full_ns = null;
|
||||
if (NetHelper.IsNetNamespace(name, _unar, out full_ns) == true)
|
||||
{
|
||||
compiled_namespace_node cnn = new compiled_namespace_node(full_ns, _tcst);
|
||||
si = new SymbolInfo(cnn);
|
||||
si = new SymbolInfoList(new SymbolInfoUnit(cnn));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -154,7 +154,7 @@ namespace PascalABCCompiler.NetHelper
|
|||
if (t != null)
|
||||
{
|
||||
compiled_type_node ctn = compiled_type_node.get_type_node(t, _tcst);
|
||||
si = new SymbolInfo(ctn);
|
||||
si = new SymbolInfoList(new SymbolInfoUnit(ctn));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -163,7 +163,7 @@ namespace PascalABCCompiler.NetHelper
|
|||
type_node pas_tn = NetHelper.FindCompiledPascalType(entry_type.Namespace + "." + name);
|
||||
if (pas_tn != null)
|
||||
{
|
||||
si = new SymbolInfo(pas_tn);
|
||||
si = new SymbolInfoList(new SymbolInfoUnit(pas_tn));
|
||||
return si;
|
||||
}
|
||||
else
|
||||
|
|
@ -171,7 +171,7 @@ namespace PascalABCCompiler.NetHelper
|
|||
template_class tc = NetHelper.FindCompiledTemplateType(entry_type.Namespace + "." + name);
|
||||
if (tc != null)
|
||||
{
|
||||
si = new SymbolInfo(tc);
|
||||
si = new SymbolInfoList(new SymbolInfoUnit(tc));
|
||||
return si;
|
||||
}
|
||||
}
|
||||
|
|
@ -179,7 +179,7 @@ namespace PascalABCCompiler.NetHelper
|
|||
if (SemanticRules.AllowGlobalVisibilityForPABCDll && entry_type != null)
|
||||
{
|
||||
t = NetHelper.FindType(entry_type.Namespace + "." + name);
|
||||
if (t != null) si = new SymbolInfo(compiled_type_node.get_type_node(t));
|
||||
if (t != null) si = new SymbolInfoList(new SymbolInfoUnit(compiled_type_node.get_type_node(t)));
|
||||
else
|
||||
{
|
||||
object[] attrs = entry_type.GetCustomAttributes(false);
|
||||
|
|
@ -206,8 +206,8 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
}
|
||||
}
|
||||
return si;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
private Type in_type_list(string name)
|
||||
{
|
||||
|
|
@ -247,13 +247,11 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
}
|
||||
|
||||
public override SymbolInfo Find(string name, SymbolTable.Scope CurrentScope)
|
||||
{
|
||||
SymbolInfo si = NetHelper.FindName(type_info,name);
|
||||
return si;
|
||||
//return si;
|
||||
}
|
||||
}
|
||||
public override SymbolInfoList Find(string name, SymbolTable.Scope CurrentScope)
|
||||
{
|
||||
return NetHelper.FindName(type_info, name);
|
||||
}
|
||||
}
|
||||
|
||||
public static class NetHelper {
|
||||
private static Hashtable namespaces;
|
||||
|
|
@ -383,9 +381,8 @@ namespace PascalABCCompiler.NetHelper
|
|||
byte[] buf = new byte[fs.Length];
|
||||
fs.Read(buf, 0, (int)fs.Length);
|
||||
fs.Close();
|
||||
curr_inited_assm_path = name;
|
||||
a = System.Reflection.Assembly.Load(buf);
|
||||
|
||||
curr_inited_assm_path = name;
|
||||
a.GetTypes();
|
||||
buf = null;
|
||||
//Thread th = new Thread(new ThreadStart(collect_internal));
|
||||
|
|
@ -422,6 +419,13 @@ namespace PascalABCCompiler.NetHelper
|
|||
{
|
||||
|
||||
Type[] tarr = _assembly.GetTypes();
|
||||
/*if (_assembly.ManifestModule.ScopeName == "System.Core.dll")
|
||||
{
|
||||
ExtensionAttributeType = _assembly.GetType("System.Runtime.CompilerServices.ExtensionAttribute");
|
||||
SystemCoreAssembly = _assembly;
|
||||
members.Clear();
|
||||
|
||||
}*/
|
||||
//Hashtable ns_ht = new Hashtable(CaseInsensitiveHashCodeProvider.Default,CaseInsensitiveComparer.Default);
|
||||
Hashtable ns_ht = new Hashtable(StringComparer.CurrentCultureIgnoreCase);
|
||||
foreach (Type t in tarr)
|
||||
|
|
@ -895,18 +899,14 @@ namespace PascalABCCompiler.NetHelper
|
|||
{
|
||||
try
|
||||
{
|
||||
if (curr_inited_assm_path != null)
|
||||
{
|
||||
Assembly assm = null;
|
||||
string path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(curr_inited_assm_path), args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
|
||||
if (System.IO.File.Exists(path))
|
||||
assm = LoadAssembly(path);
|
||||
curr_inited_assm_path = null;
|
||||
|
||||
//return LoadAssembly(args.Name);
|
||||
return assm;
|
||||
}
|
||||
return null;
|
||||
Assembly assm = null;
|
||||
string path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(curr_inited_assm_path),args.Name.Substring(0,args.Name.IndexOf(","))+".dll");
|
||||
if (System.IO.File.Exists(path))
|
||||
assm = LoadAssembly(path);
|
||||
curr_inited_assm_path = null;
|
||||
|
||||
//return LoadAssembly(args.Name);
|
||||
return assm;
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
|
@ -1052,21 +1052,21 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
if (scope != null)
|
||||
{
|
||||
SymbolInfo si = scope.FindOnlyInType(op_name, scope);
|
||||
while (si != null)
|
||||
{
|
||||
if (si.sym_info is common_namespace_function_node)
|
||||
SymbolInfoList si = scope.FindOnlyInType(op_name, scope);
|
||||
if(si != null)
|
||||
foreach(SymbolInfoUnit si_unit in si.InfoUnitList)
|
||||
{
|
||||
function_node fn = si.sym_info as function_node;
|
||||
if ((fn.return_value_type == to || fn.return_value_type.original_generic == to) &&
|
||||
fn.parameters.Count == 1 &&
|
||||
(fn.parameters[0].type == from || fn.parameters[0].type.original_generic == from))
|
||||
if (si_unit.sym_info is common_namespace_function_node)
|
||||
{
|
||||
return fn;
|
||||
function_node fn = si_unit.sym_info as function_node;
|
||||
if ((fn.return_value_type == to || fn.return_value_type.original_generic == to) &&
|
||||
fn.parameters.Count == 1 &&
|
||||
(fn.parameters[0].type == from || fn.parameters[0].type.original_generic == from))
|
||||
{
|
||||
return fn;
|
||||
}
|
||||
}
|
||||
}
|
||||
si = si.Next;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
@ -1420,7 +1420,7 @@ namespace PascalABCCompiler.NetHelper
|
|||
temp = new SymbolInfo(GetPropertyNode((PropertyInfo)mi));
|
||||
break;
|
||||
case MemberTypes.Field:
|
||||
temp = GetSymbolInfoForFieldNode((FieldInfo)mi);
|
||||
temp = GetSymbolInfoForFieldNode((FieldInfo)mi).ToSymbolInfo();
|
||||
break;
|
||||
case MemberTypes.Event:
|
||||
temp = new SymbolInfo(GetEvent((EventInfo)mi));
|
||||
|
|
@ -1449,22 +1449,22 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
public static SymbolInfo FindName(Type t, string name)
|
||||
{
|
||||
if (name == null) return null;
|
||||
if (name == compiler_string_consts.assign_name) return null;
|
||||
|
||||
public static SymbolInfoList FindName(Type t, string name)
|
||||
{
|
||||
if (name == null) return null;
|
||||
if (name == compiler_string_consts.assign_name) return null;
|
||||
string s = compiler_string_consts.GetNETOperName(name);
|
||||
string tmp_name = name;
|
||||
if (s != null)
|
||||
{
|
||||
if (IsStandType(t)) return null;
|
||||
if (s != null)
|
||||
{
|
||||
if (IsStandType(t)) return null;
|
||||
if (t != NetHelper.PABCSystemType)
|
||||
name = s;
|
||||
}
|
||||
SymbolInfo si=null;
|
||||
|
||||
List<MemberInfo> mis = GetMembers(t,name);
|
||||
name = s;
|
||||
}
|
||||
SymbolInfoList si = null;
|
||||
|
||||
List<MemberInfo> mis = GetMembers(t, name);
|
||||
//(ssyy) Изменил алгоритм.
|
||||
//У нас некоторые алгоритмы базируются на том, что возвращённые
|
||||
//сущности будут одной природы (например, все - методы). Это неверно,
|
||||
|
|
@ -1473,54 +1473,46 @@ namespace PascalABCCompiler.NetHelper
|
|||
|
||||
//TODO: проанализировать и изменить алгоритмы, использующие поиск.
|
||||
List<SymbolInfo> si_list = new List<SymbolInfo>();
|
||||
SymbolInfo root_si = null;
|
||||
foreach (MemberInfo mi in mis)
|
||||
{
|
||||
if (mi.DeclaringType != null && PABCSystemType != null && mi.DeclaringType.Assembly == PABCSystemType.Assembly && !UsePABCRtl)
|
||||
continue;
|
||||
if (is_visible(mi))
|
||||
{
|
||||
SymbolInfo temp = null;
|
||||
SymbolInfoUnit temp = null;
|
||||
switch (mi.MemberType)
|
||||
{
|
||||
case MemberTypes.Method:
|
||||
temp = new SymbolInfo(compiled_function_node.get_compiled_method(mi as MethodInfo));
|
||||
temp = new SymbolInfoUnit(compiled_function_node.get_compiled_method(mi as MethodInfo));
|
||||
break;
|
||||
case MemberTypes.Constructor:
|
||||
temp = new SymbolInfo(compiled_constructor_node.get_compiled_constructor(mi as ConstructorInfo));
|
||||
temp = new SymbolInfoUnit(compiled_constructor_node.get_compiled_constructor(mi as ConstructorInfo));
|
||||
break;
|
||||
case MemberTypes.Property:
|
||||
temp = new SymbolInfo(GetPropertyNode(mi as PropertyInfo));
|
||||
temp = new SymbolInfoUnit(GetPropertyNode(mi as PropertyInfo));
|
||||
break;
|
||||
case MemberTypes.Field:
|
||||
temp = GetSymbolInfoForFieldNode(mi as FieldInfo);
|
||||
break;
|
||||
case MemberTypes.Event:
|
||||
temp = new SymbolInfo(GetEvent(mi as EventInfo));
|
||||
temp = new SymbolInfoUnit(GetEvent(mi as EventInfo));
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
if (root_si == null)
|
||||
{
|
||||
root_si = temp;
|
||||
si = temp;
|
||||
}
|
||||
if (si == null)
|
||||
si = new SymbolInfoList(temp);
|
||||
else
|
||||
{
|
||||
si.Next = temp;
|
||||
si = temp;
|
||||
}
|
||||
|
||||
si.Add(temp);
|
||||
|
||||
//temp.Next = si;
|
||||
//si = temp;
|
||||
}
|
||||
}
|
||||
si = root_si;
|
||||
Type nested_t = null;
|
||||
foreach (Type nt in t.GetNestedTypes())
|
||||
{
|
||||
if (string.Compare(nt.Name,name, true) == 0)
|
||||
if (string.Compare(nt.Name, name, true) == 0)
|
||||
{
|
||||
nested_t = nt;
|
||||
break;
|
||||
|
|
@ -1528,28 +1520,29 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
if (nested_t != null)
|
||||
{
|
||||
SymbolInfo temp = new SymbolInfo(compiled_type_node.get_type_node(nested_t));
|
||||
temp.Next = si;
|
||||
SymbolInfoList temp = new SymbolInfoList(new SymbolInfoUnit(compiled_type_node.get_type_node(nested_t)));
|
||||
temp.Add(si);
|
||||
si = temp;
|
||||
}
|
||||
return si;
|
||||
}
|
||||
|
||||
public static SymbolInfo GetSymbolInfoForFieldNode(FieldInfo fi)
|
||||
{
|
||||
SymbolInfo si = null;
|
||||
if (fi.IsLiteral && !fi.FieldType.IsEnum)
|
||||
{
|
||||
compiled_class_constant_definition cd = GetConstantFieldNode(fi);
|
||||
if (cd != null)
|
||||
si = new SymbolInfo(cd);
|
||||
}
|
||||
if (si == null)
|
||||
si = new SymbolInfo(GetFieldNode(fi));
|
||||
return si;
|
||||
}
|
||||
|
||||
/*
|
||||
public static SymbolInfoUnit GetSymbolInfoForFieldNode(FieldInfo fi)
|
||||
{
|
||||
SymbolInfoUnit si = null;
|
||||
if (fi.IsLiteral && !fi.FieldType.IsEnum)
|
||||
{
|
||||
compiled_class_constant_definition cd = GetConstantFieldNode(fi);
|
||||
if (cd != null)
|
||||
si = new SymbolInfoUnit(cd);
|
||||
}
|
||||
if (si == null)
|
||||
si = new SymbolInfoUnit(GetFieldNode(fi));
|
||||
return si;
|
||||
}
|
||||
|
||||
/*
|
||||
public static compiled_function_node GetMethodNode(MethodInfo mi)
|
||||
{
|
||||
compiled_function_node cfn = (compiled_function_node)meth_nodes[mi];
|
||||
|
|
@ -1560,7 +1553,7 @@ namespace PascalABCCompiler.NetHelper
|
|||
}
|
||||
*/
|
||||
|
||||
public static compiled_property_node GetPropertyNode(PropertyInfo pi)
|
||||
public static compiled_property_node GetPropertyNode(PropertyInfo pi)
|
||||
{
|
||||
compiled_property_node cpn = null;
|
||||
if (prop_nodes.TryGetValue(pi, out cpn))
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ namespace SymbolTable
|
|||
while (data[i].Area<node.Area) i++;
|
||||
if (data[i].Area==node.Area)
|
||||
{
|
||||
data[i].InfoList.Add(node.InfoList[0]);
|
||||
data[i].Add(node.InfoList[0]);
|
||||
//data[i].InfoList[0].Next = node.InfoList[0];
|
||||
return;
|
||||
//throw new Exception("Ошибка при добавлении области видимости к идентефикатору: такая область уже существует");
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -956,18 +956,20 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
basic_function_node inc_var = create_oti_method(vinc, type, SemanticTree.parameter_type.var);
|
||||
basic_function_node dec_var = create_oti_method(vdec, type, SemanticTree.parameter_type.var);
|
||||
|
||||
SymbolInfo si = type.find_in_type(compiler_string_consts.greq_name);
|
||||
basic_function_node greq = (basic_function_node)si.sym_info;
|
||||
SymbolInfoList si = type.find_in_type(compiler_string_consts.greq_name);
|
||||
basic_function_node greq = (basic_function_node)si.First().sym_info;
|
||||
|
||||
si = type.find(compiler_string_consts.smeq_name);
|
||||
basic_function_node loeq = (basic_function_node)si.sym_info;
|
||||
basic_function_node loeq = (basic_function_node)si.First().sym_info;
|
||||
|
||||
|
||||
si = type.find(compiler_string_consts.sm_name);
|
||||
basic_function_node lo = (basic_function_node)si.sym_info;
|
||||
basic_function_node lo = (basic_function_node)si.First().sym_info;
|
||||
|
||||
|
||||
si = type.find(compiler_string_consts.gr_name);
|
||||
basic_function_node gr = (basic_function_node)si.sym_info;
|
||||
|
||||
basic_function_node gr = (basic_function_node)si.First().sym_info;
|
||||
|
||||
ordinal_type_interface oti = new ordinal_type_interface(inc_value, dec_value, inc_var, dec_var,
|
||||
loeq, greq, lo, gr, lower_value, upper_value, t2i, t2i_comp);
|
||||
|
||||
|
|
|
|||
|
|
@ -21,10 +21,16 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
if (_notCreatedSymbolInfo != null)
|
||||
return _notCreatedSymbolInfo;
|
||||
if (cmn != null)
|
||||
_notCreatedSymbolInfo = cmn.scope.SymbolTable.Find(cmn.scope, name);
|
||||
{
|
||||
var temp = cmn.scope.SymbolTable.Find(cmn.scope, name);
|
||||
if (temp != null)
|
||||
_notCreatedSymbolInfo = temp.ToSymbolInfo();
|
||||
else
|
||||
_notCreatedSymbolInfo = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Type t = NetHelper.NetHelper.PABCSystemType.Assembly.GetType("PABCSystem."+name);
|
||||
Type t = NetHelper.NetHelper.PABCSystemType.Assembly.GetType("PABCSystem." + name);
|
||||
if (t != null)
|
||||
{
|
||||
_notCreatedSymbolInfo = new TreeConverter.SymbolInfo(compiled_type_node.get_type_node(t, SystemLibrary.syn_visitor.SymbolTable));
|
||||
|
|
@ -32,7 +38,10 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
else
|
||||
{
|
||||
compiled_type_node ctn = compiled_type_node.get_type_node(NetHelper.NetHelper.PABCSystemType);
|
||||
_notCreatedSymbolInfo = ctn.find_in_type(name);
|
||||
_notCreatedSymbolInfo = null;
|
||||
var temp = ctn.find_in_type(name);
|
||||
if (temp != null)
|
||||
_notCreatedSymbolInfo = temp.ToSymbolInfo();
|
||||
/*if (name == TreeConverter.compiler_string_consts.read_procedure_name || name == TreeConverter.compiler_string_consts.readln_procedure_name)
|
||||
{
|
||||
compiled_type_node ctn2 = compiled_type_node.get_type_node(NetHelper.NetHelper.PT4Type);
|
||||
|
|
@ -77,7 +86,13 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
if (symbolInfo != null)
|
||||
return symbolInfo;
|
||||
if (cmn != null)
|
||||
symbolInfo = cmn.scope.Find(name);
|
||||
{
|
||||
var temp = cmn.scope.Find(name);
|
||||
if (temp != null)
|
||||
symbolInfo = temp.ToSymbolInfo();
|
||||
else
|
||||
symbolInfo = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Type t = NetHelper.NetHelper.PABCSystemType.Assembly.GetType("PABCSystem." + name);
|
||||
|
|
@ -88,7 +103,10 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
else
|
||||
{
|
||||
compiled_type_node ctn = compiled_type_node.get_type_node(NetHelper.NetHelper.PABCSystemType);
|
||||
symbolInfo = ctn.find_in_type(name);
|
||||
symbolInfo = null;
|
||||
var temp = ctn.find_in_type(name);
|
||||
if (temp != null)
|
||||
symbolInfo = temp.ToSymbolInfo();
|
||||
/*if (name == TreeConverter.compiler_string_consts.read_procedure_name || name == TreeConverter.compiler_string_consts.readln_procedure_name)
|
||||
{
|
||||
compiled_type_node ctn2 = compiled_type_node.get_type_node(NetHelper.NetHelper.PT4Type);
|
||||
|
|
@ -108,31 +126,31 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
{
|
||||
common_type_node tctn = symbolInfo.sym_info as common_type_node;
|
||||
tctn.type_special_kind = SemanticTree.type_special_kind.base_set_type;
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.plus_name, SystemLibInitializer.SetUnionProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.mul_name, SystemLibInitializer.SetIntersectProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.in_name, SystemLibInitializer.InSetProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.minus_name, SystemLibInitializer.SetSubtractProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.gr_name, SystemLibInitializer.CompareSetGreater.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.greq_name, SystemLibInitializer.CompareSetGreaterEqual.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.sm_name, SystemLibInitializer.CompareSetLess.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.smeq_name, SystemLibInitializer.CompareSetLessEqual.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.eq_name, SystemLibInitializer.CompareSetEquals.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.noteq_name, SystemLibInitializer.CompareSetInEquals.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.plus_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.SetUnionProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.mul_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.SetIntersectProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.in_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.InSetProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.minus_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.SetSubtractProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.gr_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetGreater.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.greq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetGreaterEqual.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.sm_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetLess.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.smeq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetLessEqual.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.eq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetEquals.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.noteq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetInEquals.SymbolInfo));
|
||||
}
|
||||
else
|
||||
{
|
||||
compiled_type_node tctn = symbolInfo.sym_info as compiled_type_node;
|
||||
tctn.type_special_kind = SemanticTree.type_special_kind.base_set_type;
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.plus_name, SystemLibInitializer.SetUnionProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.mul_name, SystemLibInitializer.SetIntersectProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.in_name, SystemLibInitializer.InSetProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.minus_name, SystemLibInitializer.SetSubtractProcedure.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.gr_name, SystemLibInitializer.CompareSetGreater.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.greq_name, SystemLibInitializer.CompareSetGreaterEqual.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.sm_name, SystemLibInitializer.CompareSetLess.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.smeq_name, SystemLibInitializer.CompareSetLessEqual.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.eq_name, SystemLibInitializer.CompareSetEquals.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.noteq_name, SystemLibInitializer.CompareSetInEquals.SymbolInfo);
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.plus_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.SetUnionProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.mul_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.SetIntersectProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.in_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.InSetProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.minus_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.SetSubtractProcedure.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.gr_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetGreater.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.greq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetGreaterEqual.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.sm_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetLess.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.smeq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetLessEqual.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.eq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetEquals.SymbolInfo));
|
||||
tctn.scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.noteq_name, new TreeConverter.SymbolInfoUnit(SystemLibInitializer.CompareSetInEquals.SymbolInfo));
|
||||
}
|
||||
}
|
||||
else if (symbolInfo != null && SystemLibInitializer.TextFileType.Equal(symbolInfo))
|
||||
|
|
@ -212,7 +230,11 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
{
|
||||
if (symbolInfo != null)
|
||||
return symbolInfo.sym_info as type_node;
|
||||
symbolInfo = cmn.scope.Find(name);
|
||||
var temp = cmn.scope.Find(name);
|
||||
if (temp != null)
|
||||
symbolInfo = temp.ToSymbolInfo();
|
||||
else
|
||||
symbolInfo = null;
|
||||
return symbolInfo.sym_info as type_node;
|
||||
}
|
||||
}
|
||||
|
|
@ -416,8 +438,8 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
PascalABCCompiler.TreeConverter.compiler_string_consts.false_const_name, SystemLibrary.false_constant, system_unit_location, system_namespace);
|
||||
system_namespace.constants.AddElement(_false_constant_definition);
|
||||
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.true_const_name, new PascalABCCompiler.TreeConverter.SymbolInfo(_true_constant_definition));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.false_const_name, new PascalABCCompiler.TreeConverter.SymbolInfo(_false_constant_definition));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.true_const_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(_true_constant_definition));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.false_const_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(_false_constant_definition));
|
||||
|
||||
|
||||
//TODO: Сделано по быстрому. Переделать. Можно просто один раз сериализовать модуль system и не инициализировать его всякий раз подобным образом. Неплохо-бы использовать NetHelper.GetMethod.
|
||||
|
|
@ -435,7 +457,7 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
_NewProcedure.symbol_kind = PascalABCCompiler.TreeConverter.symbol_kind.sk_overload_function;
|
||||
_NewProcedure.access_level = PascalABCCompiler.TreeConverter.access_level.al_public;
|
||||
_NewProcedureDecl = cnfn;
|
||||
sc.AddSymbol(TreeConverter.compiler_string_consts.new_procedure_name, _NewProcedure);
|
||||
sc.AddSymbol(TreeConverter.compiler_string_consts.new_procedure_name, new TreeConverter.SymbolInfoUnit(_NewProcedure));
|
||||
|
||||
cnfn = new common_namespace_function_node(TreeConverter.compiler_string_consts.dispose_procedure_name, null, null, system_namespace, null);
|
||||
cnfn.parameters.AddElement(new common_parameter("ptr", SystemLibrary.pointer_type, SemanticTree.parameter_type.value,
|
||||
|
|
@ -445,7 +467,7 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
_DisposeProcedure.access_level = PascalABCCompiler.TreeConverter.access_level.al_public;
|
||||
_DisposeProcedureDecl = cnfn;
|
||||
cnfn.SpecialFunctionKind = SemanticTree.SpecialFunctionKind.Dispose;
|
||||
sc.AddSymbol(TreeConverter.compiler_string_consts.dispose_procedure_name, _DisposeProcedure);
|
||||
sc.AddSymbol(TreeConverter.compiler_string_consts.dispose_procedure_name, new TreeConverter.SymbolInfoUnit(_DisposeProcedure));
|
||||
|
||||
cnfn = new common_namespace_function_node(TreeConverter.compiler_string_consts.new_array_procedure_name, compiled_type_node.get_type_node(typeof(Array)), null, system_namespace, null);
|
||||
cnfn.parameters.AddElement(new common_parameter("t", compiled_type_node.get_type_node(typeof(Type)), SemanticTree.parameter_type.value, cnfn,
|
||||
|
|
@ -460,20 +482,20 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
basic_function_node break_procedure = new basic_function_node(SemanticTree.basic_function_type.none,
|
||||
null, true);
|
||||
break_procedure.compile_time_executor = initialization_properties.break_executor;
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.break_procedure_name, new PascalABCCompiler.TreeConverter.SymbolInfo(break_procedure));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.break_procedure_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(break_procedure));
|
||||
|
||||
basic_function_node continue_procedure = new basic_function_node(SemanticTree.basic_function_type.none,
|
||||
null, true);
|
||||
continue_procedure.compile_time_executor = initialization_properties.continue_executor;
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.continue_procedure_name, new PascalABCCompiler.TreeConverter.SymbolInfo(continue_procedure));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.continue_procedure_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(continue_procedure));
|
||||
|
||||
basic_function_node exit_procedure = new basic_function_node(SemanticTree.basic_function_type.none,
|
||||
null, true);
|
||||
exit_procedure.compile_time_executor = initialization_properties.exit_executor;
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.exit_procedure_name, new PascalABCCompiler.TreeConverter.SymbolInfo(exit_procedure));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.exit_procedure_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(exit_procedure));
|
||||
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.set_length_procedure_name,
|
||||
new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.resize_func, PascalABCCompiler.TreeConverter.access_level.al_public, PascalABCCompiler.TreeConverter.symbol_kind.sk_overload_function));
|
||||
new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.resize_func, PascalABCCompiler.TreeConverter.access_level.al_public, PascalABCCompiler.TreeConverter.symbol_kind.sk_overload_function));
|
||||
}
|
||||
|
||||
public static common_unit_node make_system_unit(SymbolTable.TreeConverterSymbolTable symbol_table,
|
||||
|
|
@ -489,31 +511,31 @@ namespace PascalABCCompiler.SystemLibrary
|
|||
common_namespace_node cnn = new common_namespace_node(null, _system_unit, PascalABCCompiler.TreeConverter.compiler_string_consts.system_unit_name,
|
||||
symbol_table.CreateScope(main_scope),system_unit_location);
|
||||
|
||||
main_scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.system_unit_name, new PascalABCCompiler.TreeConverter.SymbolInfo(cnn));
|
||||
main_scope.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.system_unit_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(cnn));
|
||||
|
||||
//SymbolTable.Scope sc = cnn.scope;
|
||||
SymbolTable.Scope sc = main_scope;
|
||||
|
||||
//Добавляем типы.
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.byte_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.byte_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.byte_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.byte_type));
|
||||
//sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.decimal_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.decimal_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.sbyte_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.sbyte_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.short_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.short_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.ushort_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.ushort_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.integer_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.integer_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.uint_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.uint_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.long_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.int64_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.ulong_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.uint64_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.float_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.float_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.real_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.double_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.char_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.char_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.bool_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.bool_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.string_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.string_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.sbyte_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.sbyte_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.short_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.short_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.ushort_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.ushort_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.integer_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.integer_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.uint_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.uint_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.long_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.int64_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.ulong_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.uint64_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.float_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.float_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.real_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.double_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.char_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.char_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.bool_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.bool_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.string_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.string_type));
|
||||
//sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.object_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.object_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.pointer_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.pointer_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.pointer_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.pointer_type));
|
||||
//sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.base_exception_class_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.exception_base_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.base_array_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.array_base_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.base_delegate_type_name, new PascalABCCompiler.TreeConverter.SymbolInfo(SystemLibrary.delegate_base_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.base_array_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.array_base_type));
|
||||
sc.AddSymbol(PascalABCCompiler.TreeConverter.compiler_string_consts.base_delegate_type_name, new PascalABCCompiler.TreeConverter.SymbolInfoUnit(SystemLibrary.delegate_base_type));
|
||||
|
||||
//TODO: Переделать. Пусть таблица символов создается одна. Как статическая.
|
||||
compiled_type_node comp_byte_type = ((compiled_type_node)SystemLibrary.byte_type);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -194,12 +194,12 @@ namespace PascalABCCompiler.TreeConverter
|
|||
el.AddElement(exprs[0]);
|
||||
el.AddElement(cfc);
|
||||
|
||||
SymbolInfo si = exprs[0].type.find_in_type(compiler_string_consts.assign_name);
|
||||
SymbolInfoList si = exprs[0].type.find_in_type(compiler_string_consts.assign_name);
|
||||
if (si == null)
|
||||
{
|
||||
throw new CompilerInternalError("Undefined delegate operation");
|
||||
}
|
||||
function_node fn = (function_node)si.sym_info;
|
||||
function_node fn = (function_node)si.First().sym_info;
|
||||
|
||||
expression_node en = convertion_data_and_alghoritms.create_simple_function_call(fn,
|
||||
call_location, el[0], el[1]);
|
||||
|
|
@ -221,12 +221,12 @@ namespace PascalABCCompiler.TreeConverter
|
|||
el.AddElement(exprs[0]);
|
||||
el.AddElement(cfc);
|
||||
|
||||
SymbolInfo si = exprs[0].type.find_in_type(compiler_string_consts.assign_name);
|
||||
SymbolInfoList si = exprs[0].type.find_in_type(compiler_string_consts.assign_name);
|
||||
if (si == null)
|
||||
{
|
||||
throw new CompilerInternalError("Undefined delegate operation");
|
||||
}
|
||||
function_node fn = (function_node)si.sym_info;
|
||||
function_node fn = (function_node)si.First().sym_info;
|
||||
|
||||
expression_node en = convertion_data_and_alghoritms.create_simple_function_call(fn,
|
||||
call_location, el[0], el[1]);
|
||||
|
|
@ -331,7 +331,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
common_method_node cmn_add = new common_method_node(compiler_string_consts.plus_name, ctn, loc, ctn, SemanticTree.polymorphic_state.ps_static,
|
||||
SemanticTree.field_access_level.fal_public, ctn.scope);
|
||||
cmn_add.compile_time_executor = delegate_add_compile_time_executor;
|
||||
ctn.scope.AddSymbol(cmn_add.name, new SymbolInfo(cmn_add));
|
||||
ctn.scope.AddSymbol(cmn_add.name, new SymbolInfoUnit(cmn_add));
|
||||
common_parameter cp1 = new common_parameter(compiler_string_consts.left_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
cmn_add, concrete_parameter_type.cpt_none, null, loc);
|
||||
common_parameter cp2 = new common_parameter(compiler_string_consts.right_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
|
|
@ -343,7 +343,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
common_method_node cmn_add_assign = new common_method_node(compiler_string_consts.plusassign_name, ctn, loc, ctn, SemanticTree.polymorphic_state.ps_static,
|
||||
SemanticTree.field_access_level.fal_public, ctn.scope);
|
||||
cmn_add_assign.compile_time_executor = delegate_add_assign_compile_time_executor;
|
||||
ctn.scope.AddSymbol(cmn_add_assign.name, new SymbolInfo(cmn_add_assign));
|
||||
ctn.scope.AddSymbol(cmn_add_assign.name, new SymbolInfoUnit(cmn_add_assign));
|
||||
common_parameter cp3 = new common_parameter(compiler_string_consts.left_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
cmn_add_assign, concrete_parameter_type.cpt_none, null, loc);
|
||||
common_parameter cp4 = new common_parameter(compiler_string_consts.right_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
|
|
@ -355,7 +355,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
common_method_node cmn_sub = new common_method_node(compiler_string_consts.minus_name, ctn, loc, ctn, SemanticTree.polymorphic_state.ps_static,
|
||||
SemanticTree.field_access_level.fal_public, ctn.scope);
|
||||
cmn_sub.compile_time_executor = delegate_sub_compile_time_executor;
|
||||
ctn.scope.AddSymbol(cmn_sub.name, new SymbolInfo(cmn_sub));
|
||||
ctn.scope.AddSymbol(cmn_sub.name, new SymbolInfoUnit(cmn_sub));
|
||||
common_parameter cp12 = new common_parameter(compiler_string_consts.left_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
cmn_sub, concrete_parameter_type.cpt_none, null, loc);
|
||||
common_parameter cp22 = new common_parameter(compiler_string_consts.right_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
|
|
@ -367,7 +367,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
common_method_node cmn_sub_assign = new common_method_node(compiler_string_consts.minusassign_name, ctn, loc, ctn, SemanticTree.polymorphic_state.ps_static,
|
||||
SemanticTree.field_access_level.fal_public, ctn.scope);
|
||||
cmn_sub_assign.compile_time_executor = delegate_sub_assign_compile_time_executor;
|
||||
ctn.scope.AddSymbol(cmn_sub_assign.name, new SymbolInfo(cmn_sub_assign));
|
||||
ctn.scope.AddSymbol(cmn_sub_assign.name, new SymbolInfoUnit(cmn_sub_assign));
|
||||
common_parameter cp32 = new common_parameter(compiler_string_consts.left_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
cmn_sub_assign, concrete_parameter_type.cpt_none, null, loc);
|
||||
common_parameter cp42 = new common_parameter(compiler_string_consts.right_param_name, ctn, SemanticTree.parameter_type.value,
|
||||
|
|
@ -416,15 +416,15 @@ namespace PascalABCCompiler.TreeConverter
|
|||
|
||||
class_constant_definition cdn1 = new class_constant_definition(compiler_string_consts.lower_array_const_name,
|
||||
oti_indexer.lower_value, loc, ctn, SemanticTree.field_access_level.fal_public);
|
||||
ctn.scope.AddSymbol(cdn1.name, new SymbolInfo(cdn1));
|
||||
ctn.scope.AddSymbol(cdn1.name, new SymbolInfoUnit(cdn1));
|
||||
|
||||
class_constant_definition cdn2 = new class_constant_definition(compiler_string_consts.upper_array_const_name,
|
||||
oti_indexer.upper_value, loc, ctn, SemanticTree.field_access_level.fal_public);
|
||||
ctn.scope.AddSymbol(cdn2.name, new SymbolInfo(cdn2));
|
||||
ctn.scope.AddSymbol(cdn2.name, new SymbolInfoUnit(cdn2));
|
||||
|
||||
class_field int_arr = new class_field(compiler_string_consts.internal_array_name, sa, ctn,
|
||||
SemanticTree.polymorphic_state.ps_common, SemanticTree.field_access_level.fal_public,loc);
|
||||
ctn.scope.AddSymbol(int_arr.name, new SymbolInfo(int_arr));
|
||||
ctn.scope.AddSymbol(int_arr.name, new SymbolInfoUnit(int_arr));
|
||||
ctn.fields.AddElement(int_arr);
|
||||
|
||||
SystemLibrary.SystemLibrary.init_reference_type(ctn);
|
||||
|
|
@ -479,20 +479,20 @@ namespace PascalABCCompiler.TreeConverter
|
|||
|
||||
expression_node index_expr2 = new simple_array_indexing(cfr2, sub_expr2, element_type,loc);
|
||||
|
||||
SymbolInfo si = element_type.find_in_type(compiler_string_consts.assign_name);
|
||||
SymbolInfoList si = element_type.find_in_type(compiler_string_consts.assign_name);
|
||||
if (si == null)
|
||||
{
|
||||
throw new NotSupportedError(loc);
|
||||
throw new CompilerInternalError("Varable of this type can not be assigned");
|
||||
}
|
||||
if (si.sym_info.general_node_type != general_node_type.function_node)
|
||||
if (si.First().sym_info.general_node_type != general_node_type.function_node)
|
||||
{
|
||||
throw new CompilerInternalError("Invalid assign operator");
|
||||
}
|
||||
|
||||
expression_node val_ref = new common_parameter_reference(set_val, 0, loc);
|
||||
|
||||
function_node assign = (function_node)si.sym_info;
|
||||
function_node assign = (function_node)si.First().sym_info;
|
||||
statement_node assign_call = convertion_data_and_alghoritms.create_simple_function_call(assign,
|
||||
/*loc*/new location(0xFFFFFF, 0, 0xFFFFFF, 0, loc.doc), index_expr2, val_ref);
|
||||
|
||||
|
|
@ -526,7 +526,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
ctn.ImplementingInterfaces.Add(compiled_type_node.get_type_node(NetHelper.NetHelper.FindType(compiler_string_consts.IEnumerableInterfaceName)));
|
||||
common_method_node en_cmn = new common_method_node(compiler_string_consts.GetEnumeratorMethodName, compiled_type_node.get_type_node(NetHelper.NetHelper.FindType(compiler_string_consts.IEnumeratorInterfaceName)), null, ctn, SemanticTree.polymorphic_state.ps_virtual, SemanticTree.field_access_level.fal_public, null);
|
||||
|
||||
compiled_function_node en_fnc = NetHelper.NetHelper.FindName(NetHelper.NetHelper.FindType(compiler_string_consts.IEnumerableInterfaceName), compiler_string_consts.GetEnumeratorMethodName).sym_info as compiled_function_node;
|
||||
compiled_function_node en_fnc = NetHelper.NetHelper.FindName(NetHelper.NetHelper.FindType(compiler_string_consts.IEnumerableInterfaceName), compiler_string_consts.GetEnumeratorMethodName).First().sym_info as compiled_function_node;
|
||||
statements_list sl = new statements_list(null);
|
||||
sl.statements.AddElement(new return_node(
|
||||
new compiled_function_call(en_fnc, new class_field_reference(int_arr, new this_node(ctn, null), null), null), null));
|
||||
|
|
@ -543,10 +543,10 @@ namespace PascalABCCompiler.TreeConverter
|
|||
|
||||
en_cmn = new common_method_node(compiler_string_consts.GetEnumeratorMethodName, compiled_type_node.get_type_node(NetHelper.NetHelper.FindType(compiler_string_consts.IGenericEnumeratorInterfaceName)).get_instance(generic_args), null, ctn, SemanticTree.polymorphic_state.ps_virtual, SemanticTree.field_access_level.fal_public, null);
|
||||
//en_fnc = en_tn.find_in_type("GetEnumerator").sym_info as function_node;//NetHelper.NetHelper.FindName(NetHelper.NetHelper.FindType(compiler_string_consts.IGenericEnumerableInterfaceName), compiler_string_consts.GetEnumeratorMethodName).sym_info as compiled_function_node;
|
||||
SymbolInfo en_si = en_tn.find_in_type("GetEnumerator");
|
||||
if (en_si.Next != null && (en_si.Next.sym_info as function_node).return_value_type.is_generic_type_instance)
|
||||
en_si = en_si.Next;
|
||||
function_node en_fnc_inst = en_si.sym_info as function_node; ;//.get_instance(generic_args, true, loc);
|
||||
SymbolInfoList en_si = en_tn.find_in_type("GetEnumerator");
|
||||
if (en_si.InfoUnitList.Count > 1 && (en_si.InfoUnitList[1].sym_info as function_node).return_value_type.is_generic_type_instance)
|
||||
en_si.InfoUnitList = en_si.InfoUnitList.GetRange(1, en_si.InfoUnitList.Count - 1);
|
||||
function_node en_fnc_inst = en_si.First().sym_info as function_node; ;//.get_instance(generic_args, true, loc);
|
||||
sl = new statements_list(null);
|
||||
if (en_fnc_inst is compiled_function_node)
|
||||
sl.statements.AddElement(new return_node(
|
||||
|
|
@ -593,7 +593,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
cmn_eq.function_code = body;
|
||||
cmn_eq.is_overload = true;
|
||||
ctn.methods.AddElement(cmn_eq);
|
||||
ctn.Scope.AddSymbol(compiler_string_consts.eq_name,new SymbolInfo(cmn_eq));
|
||||
ctn.Scope.AddSymbol(compiler_string_consts.eq_name,new SymbolInfoUnit(cmn_eq));
|
||||
|
||||
//<> operation
|
||||
scope = convertion_data_and_alghoritms.symbol_table.CreateClassMethodScope(_cmn.scope,ctn.scope);
|
||||
|
|
@ -628,7 +628,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
cmn_noteq.function_code = body;
|
||||
cmn_noteq.is_overload = true;
|
||||
ctn.methods.AddElement(cmn_noteq);
|
||||
ctn.Scope.AddSymbol(compiler_string_consts.noteq_name,new SymbolInfo(cmn_noteq));
|
||||
ctn.Scope.AddSymbol(compiler_string_consts.noteq_name,new SymbolInfoUnit(cmn_noteq));
|
||||
|
||||
//Equals
|
||||
/*scope = convertion_data_and_alghoritms.symbol_table.CreateClassMethodScope(_cmn.scope,ctn.scope);
|
||||
|
|
|
|||
|
|
@ -786,7 +786,10 @@ namespace PascalABCCompiler.TreeRealization
|
|||
/// <returns>Информация о найленном символе. null, если ни чего не найдено.</returns>
|
||||
public PascalABCCompiler.TreeConverter.SymbolInfo find(string name, SymbolTable.Scope CurrentScope)
|
||||
{
|
||||
return _scope.Find(name, CurrentScope);//y
|
||||
var temp = _scope.Find(name, CurrentScope);
|
||||
if (temp != null)
|
||||
return temp.ToSymbolInfo();
|
||||
return null;//y
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -196,7 +196,6 @@ namespace PascalABCCompiler.TreeRealization
|
|||
}
|
||||
|
||||
//Вспомогательный класс для создания псевдо-инстанций generic-типов.
|
||||
//TODO: sdelat singletonom. staticheskie klassy eto gadost
|
||||
public static class generic_convertions
|
||||
{
|
||||
//Список, хранящий все псевдо-инстанции generic-типов, нужен для NetGenerator.
|
||||
|
|
@ -208,8 +207,6 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
public static Hashtable generic_instances = new Hashtable();
|
||||
|
||||
public static syntax_tree_visitor visitor;
|
||||
|
||||
public static List<generic_type_instance_info> get_type_instances(type_node original_generic_type)
|
||||
{
|
||||
List<generic_type_instance_info> instances = generic_instances[original_generic_type] as List<generic_type_instance_info>;
|
||||
|
|
@ -844,9 +841,6 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
for (int i = 0; i < count_params_to_see; ++i)
|
||||
{
|
||||
if (alone && fact[i].type is delegated_methods && (fact[i].type as delegated_methods).empty_param_method != null && DeduceInstanceTypes(formal[i].type, (fact[i].type as delegated_methods).empty_param_method.type, deduced, nils))
|
||||
continue;
|
||||
else
|
||||
if (!DeduceInstanceTypes(formal[i].type, fact[i].type, deduced, nils))
|
||||
{
|
||||
if (alone && fact[i].type is delegated_methods && (fact[i].type as delegated_methods).empty_param_method != null)
|
||||
|
|
@ -985,8 +979,6 @@ namespace PascalABCCompiler.TreeRealization
|
|||
//Выведение типов
|
||||
public static bool DeduceInstanceTypes(type_node formal_type, type_node fact_type, type_node[] deduced, List<int> nils)
|
||||
{
|
||||
if (fact_type == null)//issue #347
|
||||
return false;
|
||||
if (formal_type.generic_function_container == null && fact_type.generic_function_container != null)
|
||||
{
|
||||
//swap
|
||||
|
|
@ -1006,25 +998,12 @@ namespace PascalABCCompiler.TreeRealization
|
|||
if (deduced[par_num] == null)
|
||||
{
|
||||
//Этот тип-параметр ещё не был выведен.
|
||||
if (fact_type is delegated_methods && (fact_type as delegated_methods).empty_param_method != null && (fact_type as delegated_methods).empty_param_method.ret_type != null)
|
||||
fact_type = (fact_type as delegated_methods).empty_param_method.ret_type;
|
||||
//if (fact_type is delegated_methods)
|
||||
// fact_type = visitor.CreateDelegate((fact_type as delegated_methods).proper_methods[0].simple_function_node);
|
||||
deduced[par_num] = fact_type;
|
||||
return true;
|
||||
}
|
||||
//Этот тип-параметр уже был выведен. Сравниваем с выведенным.
|
||||
if (!convertion_data_and_alghoritms.eq_type_nodes(fact_type, deduced[par_num], true))
|
||||
{
|
||||
if (fact_type is delegated_methods && deduced[par_num].IsDelegate)
|
||||
{
|
||||
delegate_internal_interface d1 = deduced[par_num].get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface;
|
||||
return convertion_data_and_alghoritms.function_eq_params_and_result((fact_type as delegated_methods).proper_methods[0].simple_function_node, d1.invoke_method);
|
||||
}
|
||||
else if (fact_type is delegated_methods && deduced[par_num] is delegated_methods)
|
||||
{
|
||||
return convertion_data_and_alghoritms.function_eq_params_and_result((fact_type as delegated_methods).proper_methods[0].simple_function_node, (deduced[par_num] as delegated_methods).proper_methods[0].simple_function_node);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
@ -1754,17 +1733,21 @@ namespace PascalABCCompiler.TreeRealization
|
|||
return rez_start;
|
||||
}
|
||||
|
||||
public override SymbolInfo find(string name, bool no_search_in_extension_methods = false)
|
||||
public override SymbolInfoList find(string name, bool no_search_in_extension_methods = false)
|
||||
{
|
||||
SymbolInfo si = _original_generic.find(name);
|
||||
si = ConvertSymbolInfo(si);
|
||||
return si;
|
||||
SymbolInfoList si = _original_generic.find(name);
|
||||
if (si != null)
|
||||
return new SymbolInfoList(ConvertSymbolInfo(si.ToSymbolInfo()));
|
||||
return new SymbolInfoList(ConvertSymbolInfo(null));//delete
|
||||
}
|
||||
|
||||
public override SymbolInfo find_in_type(string name, bool no_search_in_extension_methods = false)
|
||||
public override SymbolInfoList find_in_type(string name, bool no_search_in_extension_methods = false)
|
||||
{
|
||||
SymbolInfo si = _original_generic.find_in_type(name);
|
||||
si = ConvertSymbolInfo(si);
|
||||
SymbolInfoList si = _original_generic.find_in_type(name);
|
||||
if (si != null)
|
||||
si = new SymbolInfoList(ConvertSymbolInfo(si.ToSymbolInfo()));
|
||||
else
|
||||
si = new SymbolInfoList(ConvertSymbolInfo(null));
|
||||
return si;
|
||||
}
|
||||
|
||||
|
|
@ -1777,8 +1760,8 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
private void conform_basic_function(string name, int base_func_num)
|
||||
{
|
||||
SymbolInfo si1 = _original_generic.find_in_type(name);
|
||||
AddMember(si1.sym_info, temp_names[base_func_num].sym_info);
|
||||
SymbolInfoList si1 = _original_generic.find_in_type(name);
|
||||
AddMember(si1.First().sym_info, temp_names[base_func_num].sym_info);
|
||||
}
|
||||
|
||||
public void conform_basic_functions()
|
||||
|
|
@ -2239,4 +2222,5 @@ namespace PascalABCCompiler.TreeRealization
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -448,11 +448,17 @@ namespace PascalABCCompiler.TreeRealization
|
|||
/// <returns>Информация о найденом символе. null, если ни чего не найдена.</returns>
|
||||
public override SymbolInfo find(string name)
|
||||
{
|
||||
return _scope.Find(name);//c,cc,c,cc
|
||||
}
|
||||
var temp = _scope.Find(name);//c,cc,c,cc
|
||||
if (temp != null)
|
||||
return temp.ToSymbolInfo();
|
||||
return null;
|
||||
}
|
||||
public SymbolInfo findOnlyInNamespace(string name)
|
||||
{
|
||||
return _scope.FindOnlyInScope(name);//c,cc,c,cc
|
||||
var temp = _scope.FindOnlyInScope(name);//c,cc,c,cc
|
||||
if (temp != null)
|
||||
return temp.ToSymbolInfo();
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -662,7 +668,11 @@ namespace PascalABCCompiler.TreeRealization
|
|||
t = NetHelper.NetHelper.FindType(_name+"."+_name);
|
||||
if (t != null && NetHelper.NetHelper.IsEntryType(t))
|
||||
{
|
||||
si = NetHelper.NetHelper.FindName(t,name);
|
||||
var temp = NetHelper.NetHelper.FindName(t,name);
|
||||
if (temp != null)
|
||||
si = temp.ToSymbolInfo();
|
||||
else
|
||||
si = null;
|
||||
if (si == null)
|
||||
{
|
||||
type_node tn = NetHelper.NetHelper.FindCompiledPascalType(_name + "." + name);
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@ namespace PascalABCCompiler.TreeRealization
|
|||
using_namespace_list new_unl = new using_namespace_list();
|
||||
foreach (using_namespace un in unl)
|
||||
{
|
||||
SymbolInfo si = netsc.FindOnlyInScope(un.namespace_name);
|
||||
if ((si.sym_info as compiled_namespace_node) != null)
|
||||
SymbolInfoList si = netsc.FindOnlyInScope(un.namespace_name);
|
||||
if ((si.First().sym_info as compiled_namespace_node) != null)
|
||||
{
|
||||
new_unl.AddElement(un);
|
||||
}
|
||||
|
|
@ -479,13 +479,13 @@ namespace PascalABCCompiler.TreeRealization
|
|||
// return rez;
|
||||
//}
|
||||
|
||||
public override SymbolInfo find_in_type(string name, bool no_search_in_extension_methods = false)
|
||||
public override SymbolInfoList find_in_type(string name, bool no_search_in_extension_methods = false)
|
||||
{
|
||||
indefinite_definition_node idn = new indefinite_definition_node(name, this);
|
||||
return new SymbolInfo(idn, access_level.al_public, symbol_kind.sk_indefinite);
|
||||
return new SymbolInfoList(new SymbolInfoUnit(idn, access_level.al_public, symbol_kind.sk_indefinite));
|
||||
}
|
||||
|
||||
public override SymbolInfo find(string name, bool no_search_in_extension_methods = false)
|
||||
public override SymbolInfoList find(string name, bool no_search_in_extension_methods = false)
|
||||
{
|
||||
return find_in_type(name);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -338,196 +338,196 @@ namespace PascalABCCompiler.TreeRealization
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool is_derived(type_node base_class, type_node derived_class)
|
||||
{
|
||||
|
||||
public static bool is_derived(type_node base_class,type_node derived_class)
|
||||
{
|
||||
if (derived_class == null) //void?
|
||||
return false;
|
||||
if (base_class == null)
|
||||
return false;
|
||||
type_node tn = derived_class.base_type;
|
||||
type_node tn=derived_class.base_type;
|
||||
//TODO: Проверить на ссылочный и размерный тип.
|
||||
if (derived_class.semantic_node_type == semantic_node_type.null_type_node)
|
||||
if (is_with_nil_allowed(base_class) || base_class.IsPointer)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
if (base_class.type_special_kind == SemanticTree.type_special_kind.short_string && derived_class.type_special_kind == SemanticTree.type_special_kind.short_string) return true;
|
||||
else if (derived_class == SystemLibrary.SystemLibrary.string_type && base_class.type_special_kind == SemanticTree.type_special_kind.short_string) return true;
|
||||
else if (base_class == SystemLibrary.SystemLibrary.string_type && derived_class.type_special_kind == SemanticTree.type_special_kind.short_string) return true;
|
||||
if (SystemLibrary.SystemLibInitializer.TypedSetType != null && SystemLibrary.SystemLibInitializer.TypedSetType.Found &&
|
||||
if (derived_class.semantic_node_type == semantic_node_type.null_type_node)
|
||||
if (is_with_nil_allowed(base_class) || base_class.IsPointer)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
if (base_class.type_special_kind == SemanticTree.type_special_kind.short_string && derived_class.type_special_kind == SemanticTree.type_special_kind.short_string) return true;
|
||||
else if (derived_class == SystemLibrary.SystemLibrary.string_type && base_class.type_special_kind == SemanticTree.type_special_kind.short_string) return true;
|
||||
else if (base_class == SystemLibrary.SystemLibrary.string_type && derived_class.type_special_kind == SemanticTree.type_special_kind.short_string) return true;
|
||||
if (SystemLibrary.SystemLibInitializer.TypedSetType != null && SystemLibrary.SystemLibInitializer.TypedSetType.Found &&
|
||||
base_class.type_special_kind == SemanticTree.type_special_kind.set_type && derived_class == SystemLibrary.SystemLibInitializer.TypedSetType.sym_info as type_node
|
||||
)
|
||||
return true;
|
||||
if (base_class.type_special_kind == SemanticTree.type_special_kind.set_type && derived_class.type_special_kind == SemanticTree.type_special_kind.set_type)
|
||||
{
|
||||
if (base_class.element_type == derived_class.element_type) return true;
|
||||
type_compare tc = get_table_type_compare(base_class.element_type, derived_class.element_type);
|
||||
if (tc == type_compare.non_comparable_type)
|
||||
{
|
||||
if (base_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type, derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.element_type.base_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type, derived_class.element_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.element_type.base_type.get_type_intersection(derived_class.element_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type, derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.element_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
else if (base_class.element_type.type_special_kind == SemanticTree.type_special_kind.short_string && derived_class.element_type == SystemLibrary.SystemLibrary.string_type
|
||||
|| derived_class.element_type.type_special_kind == SemanticTree.type_special_kind.short_string && base_class.element_type == SystemLibrary.SystemLibrary.string_type)
|
||||
return true;
|
||||
else return false;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
type_intersection_node tin = base_class.element_type.get_type_intersection(derived_class.element_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
//proverka na diapasony
|
||||
if (base_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type, derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin2 = base_class.element_type.base_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type, derived_class.element_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin2 = base_class.element_type.base_type.get_type_intersection(derived_class.element_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type, derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin2 = base_class.element_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
}
|
||||
if (base_class.type_special_kind == SemanticTree.type_special_kind.set_type && derived_class.type_special_kind == SemanticTree.type_special_kind.set_type)
|
||||
{
|
||||
if (base_class.element_type == derived_class.element_type) return true;
|
||||
type_compare tc = get_table_type_compare(base_class.element_type,derived_class.element_type);
|
||||
if (tc == type_compare.non_comparable_type)
|
||||
{
|
||||
if (base_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type,derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.element_type.base_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type,derived_class.element_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.element_type.base_type.get_type_intersection(derived_class.element_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type,derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.element_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
else if (base_class.element_type.type_special_kind == SemanticTree.type_special_kind.short_string && derived_class.element_type == SystemLibrary.SystemLibrary.string_type
|
||||
|| derived_class.element_type.type_special_kind == SemanticTree.type_special_kind.short_string && base_class.element_type == SystemLibrary.SystemLibrary.string_type)
|
||||
return true;
|
||||
else return false;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
type_intersection_node tin = base_class.element_type.get_type_intersection(derived_class.element_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
//proverka na diapasony
|
||||
if (base_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type,derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin2 = base_class.element_type.base_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (base_class.element_type.base_type == derived_class.element_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type.base_type,derived_class.element_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin2 = base_class.element_type.base_type.get_type_intersection(derived_class.element_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type.base_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type.base_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (derived_class.element_type.type_special_kind == PascalABCCompiler.SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.element_type == derived_class.element_type.base_type) return true;
|
||||
tc = get_table_type_compare(base_class.element_type,derived_class.element_type.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin2 = base_class.element_type.get_type_intersection(derived_class.element_type.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type
|
||||
&& (derived_class.element_type.base_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type.base_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
if (base_class.element_type != SystemLibrary.SystemLibrary.double_type && base_class.element_type != SystemLibrary.SystemLibrary.float_type)
|
||||
{
|
||||
if ((derived_class.element_type == SystemLibrary.SystemLibrary.double_type || derived_class.element_type == SystemLibrary.SystemLibrary.float_type))
|
||||
return false;
|
||||
else return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
}
|
||||
//ssyy Рассматриваем случай интерфейса
|
||||
if (base_class.IsInterface)
|
||||
{
|
||||
bool implements = false;
|
||||
type_node tnode = derived_class;
|
||||
while (!implements && tnode != null && tnode.ImplementingInterfaces != null)
|
||||
while (!implements && tnode != null && tnode.ImplementingInterfaces!=null)
|
||||
{
|
||||
implements = tnode.ImplementingInterfaces.Contains(base_class);
|
||||
tnode = tnode.base_type;
|
||||
|
|
@ -535,30 +535,30 @@ namespace PascalABCCompiler.TreeRealization
|
|||
return implements;
|
||||
}
|
||||
//\ssyy
|
||||
|
||||
|
||||
if (base_class.type_special_kind == SemanticTree.type_special_kind.diap_type && derived_class.type_special_kind == SemanticTree.type_special_kind.diap_type)
|
||||
{
|
||||
if (base_class.base_type == derived_class.base_type) return true;
|
||||
type_compare tc = get_table_type_compare(base_class.base_type, derived_class.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.base_type.get_type_intersection(derived_class.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return !tin.this_to_another.is_explicit;
|
||||
{
|
||||
if (base_class.base_type == derived_class.base_type) return true;
|
||||
type_compare tc = get_table_type_compare(base_class.base_type,derived_class.base_type);
|
||||
if (tc == type_compare.non_comparable_type) return false;
|
||||
type_intersection_node tin = base_class.base_type.get_type_intersection(derived_class.base_type);
|
||||
if (tin == null || tin.this_to_another == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return !tin.this_to_another.is_explicit;
|
||||
}
|
||||
|
||||
while ((tn != null) && (tn != base_class))
|
||||
{
|
||||
tn = tn.base_type;
|
||||
}
|
||||
if (tn == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
while((tn!=null)&&(tn!=base_class))
|
||||
{
|
||||
tn=tn.base_type;
|
||||
}
|
||||
if (tn==null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static type_compare get_table_type_compare_in_specific_order(type_node left, type_node right)
|
||||
{
|
||||
|
|
@ -770,9 +770,9 @@ namespace PascalABCCompiler.TreeRealization
|
|||
null_const_node ncn = new null_const_node(_to, call_location);
|
||||
null_const_node ncn2 = new null_const_node(_to, call_location);
|
||||
|
||||
PascalABCCompiler.TreeConverter.SymbolInfo si = pr.type.find_in_type(PascalABCCompiler.TreeConverter.compiler_string_consts.eq_name);
|
||||
PascalABCCompiler.TreeConverter.SymbolInfoList si = pr.type.find_in_type(PascalABCCompiler.TreeConverter.compiler_string_consts.eq_name);
|
||||
|
||||
basic_function_node fn = si.sym_info as basic_function_node;
|
||||
basic_function_node fn = si.First().sym_info as basic_function_node;
|
||||
expression_node condition = null;
|
||||
if (fn != null)
|
||||
{
|
||||
|
|
@ -781,9 +781,9 @@ namespace PascalABCCompiler.TreeRealization
|
|||
condition_bfc.parameters.AddElement(ncn);
|
||||
condition = condition_bfc;
|
||||
}
|
||||
else if (si.sym_info is compiled_function_node)
|
||||
else if (si.First().sym_info is compiled_function_node)
|
||||
{
|
||||
compiled_static_method_call condition_cfc = new compiled_static_method_call(si.sym_info as compiled_function_node, call_location);
|
||||
compiled_static_method_call condition_cfc = new compiled_static_method_call(si.First().sym_info as compiled_function_node, call_location);
|
||||
condition_cfc.parameters.AddElement(pr);
|
||||
condition_cfc.parameters.AddElement(ncn);
|
||||
condition = condition_cfc;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -70,7 +70,10 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
public override PascalABCCompiler.TreeConverter.SymbolInfo find_only_in_namespace(string name)
|
||||
{
|
||||
return _dotNetScope.Find(name);
|
||||
var temp = _dotNetScope.Find(name);
|
||||
if (temp != null)
|
||||
return temp.ToSymbolInfo();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -145,7 +148,7 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
public void add_unit_name_to_namespace()
|
||||
{
|
||||
this.scope.AddSymbol(unit_name, new TreeConverter.SymbolInfo(this));
|
||||
this.scope.AddSymbol(unit_name, new TreeConverter.SymbolInfoUnit(this));
|
||||
}
|
||||
|
||||
public string unit_name
|
||||
|
|
@ -236,7 +239,10 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
public override PascalABCCompiler.TreeConverter.SymbolInfo find_only_in_namespace(string name)
|
||||
{
|
||||
return _scope.FindOnlyInScope(name);
|
||||
var temp = _scope.FindOnlyInScope(name);
|
||||
if (temp != null)
|
||||
return temp.ToSymbolInfo();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue