Only use grand resolver here now that it is implemented
parent
c5f45e6a36
commit
4f32fb9619
|
@ -86,9 +86,25 @@ public final class TypeChecker
|
||||||
private void beginCheck()
|
private void beginCheck()
|
||||||
{
|
{
|
||||||
// checkIt(modulle.getStatements(), modulle.getName());
|
// checkIt(modulle.getStatements(), modulle.getName());
|
||||||
|
|
||||||
|
|
||||||
|
/* First we define global types (so classes) */
|
||||||
|
gprintln("dd");
|
||||||
|
checkClasses(modulle);
|
||||||
|
|
||||||
|
/* TODO: Then we declare global functions */
|
||||||
|
checkFunctions(modulle);
|
||||||
|
|
||||||
|
/* TODO: Then we declare global variables */
|
||||||
|
|
||||||
checkIt(modulle);
|
checkIt(modulle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkFunctions(Container c)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void checkClass(Clazz clazz)
|
private void checkClass(Clazz clazz)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -168,18 +184,8 @@ public final class TypeChecker
|
||||||
string[] dotPath = split(parent, '.');
|
string[] dotPath = split(parent, '.');
|
||||||
gprintln(dotPath.length);
|
gprintln(dotPath.length);
|
||||||
|
|
||||||
/* If the name is rooted resolve the name top-down */
|
/* Resolve the name */
|
||||||
if(dotPath.length > 1)
|
namedEntity = resolver.resolveBest(c, parent);
|
||||||
{
|
|
||||||
namedEntity = getEntity(modulle, parent);
|
|
||||||
}
|
|
||||||
/* If the name is not rooted resolve the name bottom up */
|
|
||||||
else
|
|
||||||
{
|
|
||||||
namedEntity = resolver.resolveUp(c, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
namedEntity=resolver.resolveBest(c, parent);
|
|
||||||
|
|
||||||
/* If the entity exists */
|
/* If the entity exists */
|
||||||
if(namedEntity)
|
if(namedEntity)
|
||||||
|
@ -241,6 +247,8 @@ public final class TypeChecker
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starting from a Container c this makes sure
|
* Starting from a Container c this makes sure
|
||||||
|
@ -263,6 +271,7 @@ public final class TypeChecker
|
||||||
/* Declare each type */
|
/* Declare each type */
|
||||||
foreach(Clazz clazz; classTypes)
|
foreach(Clazz clazz; classTypes)
|
||||||
{
|
{
|
||||||
|
gprintln("Name: "~resolver.generateName(modulle, clazz));
|
||||||
/**
|
/**
|
||||||
* Check if the first class found with my name is the one being
|
* Check if the first class found with my name is the one being
|
||||||
* processed, if so then it is fine, if not then error, it has
|
* processed, if so then it is fine, if not then error, it has
|
||||||
|
@ -366,13 +375,16 @@ public final class TypeChecker
|
||||||
|
|
||||||
/* TODO clazz_21_211 , crashes */
|
/* TODO clazz_21_211 , crashes */
|
||||||
|
|
||||||
|
private bool isNameInUse(Container relative, string name)
|
||||||
|
{
|
||||||
|
return resolver.resolveBest(relative, name) !is null;
|
||||||
|
}
|
||||||
|
|
||||||
private void checkIt(Container c)
|
private void checkIt(Container c)
|
||||||
{
|
{
|
||||||
//gprintln("Processing at path/level: "~path, DebugType.WARNING);
|
//gprintln("Processing at path/level: "~path, DebugType.WARNING);
|
||||||
|
|
||||||
/* First we define types (so classes) */
|
|
||||||
gprintln("dd");
|
|
||||||
checkClasses(c);
|
|
||||||
|
|
||||||
Statement[] statements = c.getStatements();
|
Statement[] statements = c.getStatements();
|
||||||
string path = c.getName();
|
string path = c.getName();
|
||||||
|
|
|
@ -15,6 +15,99 @@ public final class Resolver
|
||||||
this.typeChecker = typeChecker;
|
this.typeChecker = typeChecker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an Entity generate it's full path relative to a given
|
||||||
|
* container
|
||||||
|
*/
|
||||||
|
public string generateName(Container relativeTo, Entity entity)
|
||||||
|
{
|
||||||
|
string[] name = generateName_Internal(relativeTo, entity);
|
||||||
|
string path;
|
||||||
|
for(ulong i = 0; i < name.length; i++)
|
||||||
|
{
|
||||||
|
path ~= name[name.length-1-i];
|
||||||
|
|
||||||
|
if(i != name.length-1)
|
||||||
|
{
|
||||||
|
path ~= ".";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string[] generateName_Internal(Container relativeTo, Entity entity)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* If the Entity and Container are the same then
|
||||||
|
* just returns its name
|
||||||
|
*/
|
||||||
|
if(relativeTo == entity)
|
||||||
|
{
|
||||||
|
return [relativeTo.getName()];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* If the Entity is contained within the Container
|
||||||
|
*/
|
||||||
|
else if(isDescendant(relativeTo, entity))
|
||||||
|
{
|
||||||
|
string[] items;
|
||||||
|
|
||||||
|
Entity currentEntity = entity;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
items ~= currentEntity.getName();
|
||||||
|
currentEntity = currentEntity.parentOf();
|
||||||
|
}
|
||||||
|
while(currentEntity != relativeTo);
|
||||||
|
|
||||||
|
/* Add the relative to container */
|
||||||
|
items ~= relativeTo.getName();
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
/* If not */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if Entity e is C or is within
|
||||||
|
* (contained under c), false otherwise
|
||||||
|
*/
|
||||||
|
public bool isDescendant(Container c, Entity e)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* If they are the same
|
||||||
|
*/
|
||||||
|
if(c == e)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* If not, check descendancy
|
||||||
|
*/
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Entity currentEntity = e;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
currentEntity = currentEntity.parentOf();
|
||||||
|
|
||||||
|
if(currentEntity == c)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(currentEntity);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Entity resolveWithin(Container currentContainer, string name)
|
public Entity resolveWithin(Container currentContainer, string name)
|
||||||
{
|
{
|
||||||
Statement[] statements = currentContainer.getStatements();
|
Statement[] statements = currentContainer.getStatements();
|
||||||
|
|
|
@ -23,6 +23,11 @@ protected ubyte k3 = -1;
|
||||||
|
|
||||||
class Shekshi
|
class Shekshi
|
||||||
{
|
{
|
||||||
|
class myModule
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
class G
|
class G
|
||||||
{
|
{
|
||||||
class F
|
class F
|
||||||
|
|
Loading…
Reference in New Issue