Differential D20774 Diff 49536 src/infrastructure/lipsum/code/PhutilJavaCodeSnippetContextFreeGrammar.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/lipsum/code/PhutilJavaCodeSnippetContextFreeGrammar.php
- This file was added.
<?php | |||||
final class PhutilJavaCodeSnippetContextFreeGrammar | |||||
extends PhutilCLikeCodeSnippetContextFreeGrammar { | |||||
protected function buildRuleSet() { | |||||
$parent_ruleset = parent::buildRuleSet(); | |||||
$rulesset = array_merge($parent_ruleset, $this->getClassRuleSets()); | |||||
$rulesset[] = $this->getTypeNameGrammarSet(); | |||||
$rulesset[] = $this->getNamespaceDeclGrammarSet(); | |||||
$rulesset[] = $this->getNamespaceNameGrammarSet(); | |||||
$rulesset[] = $this->getImportGrammarSet(); | |||||
$rulesset[] = $this->getMethodReturnTypeGrammarSet(); | |||||
$rulesset[] = $this->getMethodNameGrammarSet(); | |||||
$rulesset[] = $this->getVarDeclGrammarSet(); | |||||
$rulesset[] = $this->getClassDerivGrammarSet(); | |||||
return $rulesset; | |||||
} | |||||
protected function getStartGrammarSet() { | |||||
return $this->buildGrammarSet('start', | |||||
array( | |||||
'[import, block][nmspdecl, block][classdecl, block]', | |||||
)); | |||||
} | |||||
protected function getClassDeclGrammarSet() { | |||||
return $this->buildGrammarSet('classdecl', | |||||
array( | |||||
'[classinheritancemod] [visibility] class [classname][classderiv] '. | |||||
'{[classbody, indent, block]}', | |||||
'[visibility] class [classname][classderiv] '. | |||||
'{[classbody, indent, block]}', | |||||
)); | |||||
} | |||||
protected function getClassDerivGrammarSet() { | |||||
return $this->buildGrammarSet('classderiv', | |||||
array( | |||||
' extends [classname]', | |||||
'', | |||||
'', | |||||
)); | |||||
} | |||||
protected function getTypeNameGrammarSet() { | |||||
return $this->buildGrammarSet('type', | |||||
array( | |||||
'int', | |||||
'boolean', | |||||
'char', | |||||
'short', | |||||
'long', | |||||
'float', | |||||
'double', | |||||
'[classname]', | |||||
'[type][]', | |||||
)); | |||||
} | |||||
protected function getMethodReturnTypeGrammarSet() { | |||||
return $this->buildGrammarSet('methodreturn', | |||||
array( | |||||
'[type]', | |||||
'void', | |||||
)); | |||||
} | |||||
protected function getNamespaceDeclGrammarSet() { | |||||
return $this->buildGrammarSet('nmspdecl', | |||||
array( | |||||
'package [nmspname][term]', | |||||
)); | |||||
} | |||||
protected function getNamespaceNameGrammarSet() { | |||||
return $this->buildGrammarSet('nmspname', | |||||
array( | |||||
'java.lang', | |||||
'java.io', | |||||
'com.example.proj.std', | |||||
'derp.example.www', | |||||
)); | |||||
} | |||||
protected function getImportGrammarSet() { | |||||
return $this->buildGrammarSet('import', | |||||
array( | |||||
'import [nmspname][term]', | |||||
'import [nmspname].*[term]', | |||||
'import [nmspname].[classname][term]', | |||||
)); | |||||
} | |||||
protected function getExprGrammarSet() { | |||||
$expr = parent::getExprGrammarSet(); | |||||
$expr['expr'][] = 'new [classname]([funccallparam])'; | |||||
$expr['expr'][] = '[methodcall]'; | |||||
$expr['expr'][] = '[methodcall]'; | |||||
$expr['expr'][] = '[methodcall]'; | |||||
$expr['expr'][] = '[methodcall]'; | |||||
// Add some 'char's | |||||
for ($ii = 0; $ii < 2; $ii++) { | |||||
$expr['expr'][] = "'".Filesystem::readRandomCharacters(1)."'"; | |||||
} | |||||
return $expr; | |||||
} | |||||
protected function getStmtGrammarSet() { | |||||
$stmt = parent::getStmtGrammarSet(); | |||||
$stmt['stmt'][] = '[vardecl]'; | |||||
$stmt['stmt'][] = '[vardecl]'; | |||||
// `try` to `throw` a `Ball`! | |||||
$stmt['stmt'][] = 'throw [classname][term]'; | |||||
return $stmt; | |||||
} | |||||
protected function getPropDeclGrammarSet() { | |||||
return $this->buildGrammarSet('propdecl', | |||||
array( | |||||
'[visibility] [type] [varname][term]', | |||||
)); | |||||
} | |||||
protected function getVarDeclGrammarSet() { | |||||
return $this->buildGrammarSet('vardecl', | |||||
array( | |||||
'[type] [varname][term]', | |||||
'[type] [assignment][term]', | |||||
)); | |||||
} | |||||
protected function getFuncNameGrammarSet() { | |||||
return $this->buildGrammarSet('funcname', | |||||
array( | |||||
'[methodname]', | |||||
'[classname].[methodname]', | |||||
// This is just silly (too much recursion) | |||||
// '[classname].[funcname]', | |||||
// Don't do this for now, it just clutters up output (thanks to rec.) | |||||
// '[nmspname].[classname].[methodname]', | |||||
)); | |||||
} | |||||
// Renamed from `funcname` | |||||
protected function getMethodNameGrammarSet() { | |||||
$funcnames = head(parent::getFuncNameGrammarSet()); | |||||
return $this->buildGrammarSet('methodname', $funcnames); | |||||
} | |||||
protected function getMethodFuncDeclGrammarSet() { | |||||
return $this->buildGrammarSet('methodfuncdecl', | |||||
array( | |||||
'[methodreturn] [methodname]([funcparam]) '. | |||||
'{[methodbody, indent, block, trim=right]}', | |||||
)); | |||||
} | |||||
protected function getFuncParamGrammarSet() { | |||||
return $this->buildGrammarSet('funcparam', | |||||
array( | |||||
'', | |||||
'[type] [varname]', | |||||
'[type] [varname], [type] [varname]', | |||||
'[type] [varname], [type] [varname], [type] [varname]', | |||||
)); | |||||
} | |||||
protected function getAbstractMethodDeclGrammarSet() { | |||||
return $this->buildGrammarSet('abstractmethoddecl', | |||||
array( | |||||
'abstract [methodreturn] [methodname]([funcparam])[term]', | |||||
)); | |||||
} | |||||
} |