Mapper
- Added new SymbolMapper class with a static method which will take a Container and an entity name, resolve the Entity and then generate the hash of the absolute path to said entity and return this as the `symbol name` TypeChecker - Set the static field to refer to this instance of the TypeChecker (in the SymbolMapper class) VariableDeclaration - Use the `symbolLookup()` method to transform the name
This commit is contained in:
parent
6a64ed40c9
commit
d8e5f108e4
|
@ -106,8 +106,12 @@ public final class VariableDeclaration : StorageDeclaration
|
||||||
//simple_variables.x -> simple_variables_x
|
//simple_variables.x -> simple_variables_x
|
||||||
//NOTE: We may need to create a symbol table actually and add to that and use that as these names
|
//NOTE: We may need to create a symbol table actually and add to that and use that as these names
|
||||||
//could get out of hand (too long)
|
//could get out of hand (too long)
|
||||||
|
// NOTE: Best would be identity-mapping Entity's to a name
|
||||||
string renamedSymbol = symbolRename(typedEntityVariableName);
|
string renamedSymbol = symbolRename(typedEntityVariableName);
|
||||||
|
|
||||||
|
import compiler.codegen.mapper : SymbolMapper;
|
||||||
|
renamedSymbol = SymbolMapper.symbolLookup(context.getContainer(), varName);
|
||||||
|
|
||||||
return varType~" "~renamedSymbol~";";
|
return varType~" "~renamedSymbol~";";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
module compiler.codegen.mapper;
|
||||||
|
|
||||||
|
import compiler.typecheck.core;
|
||||||
|
import compiler.symbols.data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SymbolMapper
|
||||||
|
*
|
||||||
|
* Maps Entity's to consistent but unique symbol
|
||||||
|
* names (strings)
|
||||||
|
*/
|
||||||
|
public final class SymbolMapper
|
||||||
|
{
|
||||||
|
// Used to map names to entities
|
||||||
|
public static TypeChecker tc;
|
||||||
|
|
||||||
|
// Entity map
|
||||||
|
// private string[Entity] symbolMap;
|
||||||
|
|
||||||
|
// this(TypeChecker tc)
|
||||||
|
// {
|
||||||
|
// this.tc = tc;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static string symbolLookup(Container container, string entityNameIn)
|
||||||
|
{
|
||||||
|
// Firstly translate the entity name to the full absolute path
|
||||||
|
auto entity = tc.getResolver().resolveBest(container, entityNameIn); //TODO: Remove `auto`
|
||||||
|
string entityNameAbsolute = tc.getResolver().generateName(tc.getModule(), entity);
|
||||||
|
|
||||||
|
// Hash the absolute path name
|
||||||
|
// FIXME: Ensure these hashes are unique (use the smbyol table!)
|
||||||
|
import std.digest : toHexString, LetterCase;
|
||||||
|
import std.digest.md : md5Of;
|
||||||
|
|
||||||
|
// Generate the name as `_<hexOfAbsPath>`
|
||||||
|
string symbolName = toHexString!(LetterCase.lower)(md5Of(entityNameAbsolute));
|
||||||
|
symbolName="_"~symbolName;
|
||||||
|
|
||||||
|
return symbolName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -71,6 +71,10 @@ public final class TypeChecker
|
||||||
// Allow Context class access to the type checker (used in Instruction where only Context is available)
|
// Allow Context class access to the type checker (used in Instruction where only Context is available)
|
||||||
Context.tc = this;
|
Context.tc = this;
|
||||||
|
|
||||||
|
// Allow the SymbolMapper class to access the type checker
|
||||||
|
import compiler.codegen.mapper : SymbolMapper;
|
||||||
|
SymbolMapper.tc = this;
|
||||||
|
|
||||||
// DNodeGenerator.staticTC = this;
|
// DNodeGenerator.staticTC = this;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue