Compare commits
6 Commits
Author | SHA1 | Date |
---|---|---|
|
497c6b6b0b | |
|
2802fc0345 | |
|
c330fda0cf | |
|
d228b43d1e | |
|
32daca721f | |
|
3da2b92a59 |
|
@ -0,0 +1,8 @@
|
|||
## v3.10.0
|
||||
- Adding validation of type refs pointing to named functions
|
||||
|
||||
## v3.9.0
|
||||
- Starting to experiment with new metagen parser v2.0a
|
||||
|
||||
## v3.8.0
|
||||
- Adding initial support for service type
|
|
@ -54,7 +54,9 @@ class mtgTypeRef implements mtgType
|
|||
while(sizeof(self::$unresolved) > 0)
|
||||
{
|
||||
$ref = array_shift(self::$unresolved);
|
||||
$ref->resolve();
|
||||
$resolved = $ref->resolve();
|
||||
if($resolved instanceof mtgMetaFunc && $resolved->getName())
|
||||
throw new Exception("Invalid resolving of named function as type: " . $resolved->getName() . " at " . $ref->origin);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -303,6 +305,11 @@ class mtgMetaStruct extends mtgUserType
|
|||
throw new Exception("{$this->origin} : Duplicate interface reference '{$imp->getName()}'");
|
||||
$s->attach($imp);
|
||||
}
|
||||
|
||||
foreach($this->funcs as $func)
|
||||
{
|
||||
$func->validate($meta);
|
||||
}
|
||||
}
|
||||
|
||||
function getParent()
|
||||
|
@ -456,7 +463,8 @@ class mtgMetaFunc extends mtgMetaUnit implements mtgType
|
|||
$this->name = $name;
|
||||
}
|
||||
|
||||
function validate(mtgMetaInfo $meta) {}
|
||||
function validate(mtgMetaInfo $meta)
|
||||
{}
|
||||
|
||||
function getMetaId()
|
||||
{
|
||||
|
@ -578,6 +586,7 @@ class mtgMetaService extends mtgMetaUnit implements mtgScope
|
|||
private $name;
|
||||
private $parent_scope;
|
||||
private $rpcs = array();
|
||||
private $events = array();
|
||||
private $user_types = array();
|
||||
|
||||
function __construct($name, mtgScope $parent_scope, array $tokens = array())
|
||||
|
@ -607,7 +616,7 @@ class mtgMetaService extends mtgMetaUnit implements mtgScope
|
|||
return $this->parent_scope->findSymbol($name);
|
||||
}
|
||||
|
||||
function getRPCs()
|
||||
function getRPCs() : array
|
||||
{
|
||||
return $this->rpcs;
|
||||
}
|
||||
|
@ -638,14 +647,14 @@ class mtgMetaService extends mtgMetaUnit implements mtgScope
|
|||
return $this->rpcs[$name];
|
||||
}
|
||||
|
||||
function getUserTypes()
|
||||
function getUserTypes() : array
|
||||
{
|
||||
return $this->user_types;
|
||||
}
|
||||
|
||||
function addUserType(mtgUserType $utype)
|
||||
{
|
||||
if($this->hasRPC($utype->getName()))
|
||||
if($this->hasRPC($utype->getName()) || $this->hasUserType($utype->getName()))
|
||||
throw new Exception("Service '{$this->name}' already has type '{$utype->getName()}'");
|
||||
|
||||
$this->user_types[$utype->getName()] = $utype;
|
||||
|
@ -663,6 +672,17 @@ class mtgMetaService extends mtgMetaUnit implements mtgScope
|
|||
return $this->user_types[$name];
|
||||
}
|
||||
|
||||
function addEvent(mtgMetaStruct $evt)
|
||||
{
|
||||
$this->events[] = $evt;
|
||||
$this->addUserType($evt);
|
||||
}
|
||||
|
||||
function getEvents() : array
|
||||
{
|
||||
return $this->events;
|
||||
}
|
||||
|
||||
function getClassId()
|
||||
{
|
||||
if($this->hasToken('class_id'))
|
||||
|
@ -894,6 +914,7 @@ class mtgMetaField
|
|||
{
|
||||
return $this->hasToken($name) ? $this->tokens[$name] : null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class mtgMetaPacket extends mtgMetaStruct
|
||||
|
|
|
@ -54,7 +54,7 @@ class mtgMetaParsedModule implements mtgScope
|
|||
}
|
||||
}
|
||||
|
||||
function mtg_parse_meta(array $meta_srcs, $valid_tokens = null, $inc_path = null, $version = null)
|
||||
function mtg_parse_meta(array $meta_srcs, $valid_tokens = null, $inc_path = null, $version = null, string $extension = '.meta')
|
||||
{
|
||||
if($inc_path === null)
|
||||
{
|
||||
|
@ -91,7 +91,7 @@ function mtg_parse_meta(array $meta_srcs, $valid_tokens = null, $inc_path = null
|
|||
$meta = new mtgMetaInfo();
|
||||
|
||||
foreach($meta_srcs as $src)
|
||||
mtg_load_meta($meta, $meta_parser, $src);
|
||||
mtg_load_meta($meta, $meta_parser, $src, $extension);
|
||||
|
||||
$meta->validate();
|
||||
|
||||
|
@ -100,18 +100,21 @@ function mtg_parse_meta(array $meta_srcs, $valid_tokens = null, $inc_path = null
|
|||
return $meta;
|
||||
}
|
||||
|
||||
function mtg_load_meta(mtgMetaInfo $meta, mtgIMetaInfoParser $meta_parser, string $dir_or_file)
|
||||
function mtg_load_meta(
|
||||
mtgMetaInfo $meta, mtgIMetaInfoParser $meta_parser,
|
||||
string $dir_or_file, string $extension = '.meta'
|
||||
)
|
||||
{
|
||||
$files = mtg_resolve_files($dir_or_file);
|
||||
$files = mtg_resolve_files($dir_or_file, $extension);
|
||||
foreach($files as $file)
|
||||
$meta_parser->parse($meta, $file);
|
||||
}
|
||||
|
||||
function mtg_resolve_files(string $dir_or_file) : array
|
||||
function mtg_resolve_files(string $dir_or_file, string $extension = '.meta') : array
|
||||
{
|
||||
$files = array();
|
||||
if(is_dir($dir_or_file))
|
||||
$files = mtg_find_meta_files($dir_or_file);
|
||||
$files = mtg_find_meta_files($dir_or_file, $extension);
|
||||
else if(is_file($dir_or_file))
|
||||
$files[] = $dir_or_file;
|
||||
else
|
||||
|
@ -119,7 +122,7 @@ function mtg_resolve_files(string $dir_or_file) : array
|
|||
return $files;
|
||||
}
|
||||
|
||||
function mtg_find_meta_files($dir)
|
||||
function mtg_find_meta_files($dir, $extension = '.meta')
|
||||
{
|
||||
$items = scandir($dir);
|
||||
if($items === false)
|
||||
|
@ -131,7 +134,7 @@ function mtg_find_meta_files($dir)
|
|||
if($item[0] == '.')
|
||||
continue;
|
||||
|
||||
if(strpos($item, ".meta") !== (strlen($item)-5))
|
||||
if(strpos($item, $extension) !== (strlen($item)-strlen($extension)))
|
||||
continue;
|
||||
|
||||
$file = $dir . '/' . $item;
|
||||
|
|
|
@ -31,6 +31,7 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
const T_bool = 1030;
|
||||
const T_blob = 1031;
|
||||
const T_Service = 1032;
|
||||
const T_Event = 1033;
|
||||
const T_MaxType = 1034; //built-in types end mark
|
||||
|
||||
private array $config = array();
|
||||
|
@ -95,6 +96,7 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
"extends" => self::T_Extends,
|
||||
"implements" => self::T_Implements,
|
||||
"func" => self::T_Func,
|
||||
"event" => self::T_Event,
|
||||
];
|
||||
|
||||
$this->T2descr = array_flip($this->symbol2T);
|
||||
|
@ -113,6 +115,7 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
$this->T2descr[self::T_Extends] = '<extends>';
|
||||
$this->T2descr[self::T_Implements] = '<implements>';
|
||||
$this->T2descr[self::T_Func] = '<func>';
|
||||
$this->T2descr[self::T_Event] = '<Event>';
|
||||
}
|
||||
|
||||
private static function _addDefaultTokens(array &$config)
|
||||
|
@ -355,7 +358,7 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
return $values;
|
||||
}
|
||||
|
||||
private function _parseEnum($is_global = true)
|
||||
private function _parseEnum($is_global = true) : mtgMetaEnum
|
||||
{
|
||||
$this->_nextT();
|
||||
$name = $this->_parseDotName();
|
||||
|
@ -574,6 +577,37 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
$this->_addUnit(new mtgMetaInfoUnit($this->module, $fn));
|
||||
}
|
||||
|
||||
private function _parseEvent() : mtgMetaStruct
|
||||
{
|
||||
$this->_nextT();
|
||||
$struct_origin = new mtgOrigin($this->file, $this->line);
|
||||
$name = $this->_parseDotName();
|
||||
|
||||
$this->_checkThenNext(ord('{'));
|
||||
|
||||
$s = new mtgMetaStruct($name, array(), null, array(), array());
|
||||
$s->setOrigin($struct_origin);
|
||||
|
||||
$tokens = $this->shared_tokens;
|
||||
if($this->T == self::T_Prop)
|
||||
$tokens = array_merge($tokens, $this->_parsePropTokens());
|
||||
$s->setTokens($tokens);
|
||||
|
||||
$flds = $this->_parseFields(
|
||||
function()
|
||||
{
|
||||
if($this->_nextIf(ord('}')))
|
||||
return true;
|
||||
if($this->_nextIf(self::T_Func))
|
||||
$this->_error("Events don't support functions");
|
||||
}
|
||||
);
|
||||
foreach($flds as $fld)
|
||||
$s->addField($fld);
|
||||
|
||||
return $s;
|
||||
}
|
||||
|
||||
private function _parseStruct()
|
||||
{
|
||||
$this->_nextT();
|
||||
|
@ -660,7 +694,7 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
$this->_nextT();
|
||||
}
|
||||
|
||||
private function _parseRPC($is_global = true)
|
||||
private function _parseRPC($is_global = true) : mtgMetaRPC
|
||||
{
|
||||
$this->_nextT();
|
||||
$code = $this->T_value;
|
||||
|
@ -719,6 +753,8 @@ class mtgMetaInfoParser2 implements mtgIMetaInfoParser
|
|||
$service->addRPC($this->_parseRPC(false));
|
||||
else if($this->T == self::T_Enum)
|
||||
$service->addUserType($this->_parseEnum(false));
|
||||
else if($this->T == self::T_Event)
|
||||
$service->addEvent($this->_parseEvent());
|
||||
else
|
||||
$this->_error("Unsupported type");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue