Remove old PHP stuff
This commit is contained in:
parent
b0239d8a57
commit
c5eee9e9df
1 changed files with 0 additions and 213 deletions
|
@ -23,216 +23,3 @@ def find_root(filename, starting_dir=None):
|
||||||
raise IOError('File not found in any directory')
|
raise IOError('File not found in any directory')
|
||||||
else:
|
else:
|
||||||
return find_root(filename, path.dirname(starting_dir))
|
return find_root(filename, path.dirname(starting_dir))
|
||||||
|
|
||||||
def _parse_composer_manifest(path):
|
|
||||||
'''Parse composer.json into dict'''
|
|
||||||
with open(path, 'r') as composer_file:
|
|
||||||
manifest = json.load(composer_file)
|
|
||||||
return manifest
|
|
||||||
|
|
||||||
def _get_package_name(manifest):
|
|
||||||
'''Return the name field from composer.json.'''
|
|
||||||
try:
|
|
||||||
return manifest['name']
|
|
||||||
except KeyError:
|
|
||||||
return 'foo/bar'
|
|
||||||
|
|
||||||
def _get_all_autoloaders(manifest):
|
|
||||||
'''Combine all PSR-0 and PSR-4 autoloaders'''
|
|
||||||
autoloaders = dict()
|
|
||||||
|
|
||||||
for type in ['psr-0', 'psr-4']:
|
|
||||||
autoloaders.update(_get_autoloaders_by_type(manifest, type))
|
|
||||||
|
|
||||||
return dict((p, ns) for (ns, p) in autoloaders.items())
|
|
||||||
|
|
||||||
def _get_autoloaders_by_type(manifest, type):
|
|
||||||
'''Get one kind of autoloader'''
|
|
||||||
try:
|
|
||||||
return manifest['autoload'][type]
|
|
||||||
except KeyError:
|
|
||||||
return dict()
|
|
||||||
|
|
||||||
def match_path(autoloaders, dirname):
|
|
||||||
'''Find namespace for a given path'''
|
|
||||||
prefixes = sorted(autoloaders.keys(), key=len)
|
|
||||||
|
|
||||||
try:
|
|
||||||
prefix = next(p for p in prefixes if dirname.startswith(p))
|
|
||||||
namespace = autoloaders[prefix]
|
|
||||||
remainder = dirname.replace(prefix, '', 1)
|
|
||||||
except StopIteration:
|
|
||||||
namespace = ''
|
|
||||||
remainder = dirname
|
|
||||||
|
|
||||||
return (namespace, remainder)
|
|
||||||
|
|
||||||
def convert_path(dirname):
|
|
||||||
'''Naively convert path to namespace'''
|
|
||||||
return dirname.replace('/', '\\')
|
|
||||||
|
|
||||||
def get_namespace(dirname):
|
|
||||||
'''Convert dirname into namespace intelligently.'''
|
|
||||||
try:
|
|
||||||
composer_json = find_in_parent('composer.json', dirname)
|
|
||||||
except IOError:
|
|
||||||
return None
|
|
||||||
composer_manifest = _parse_composer_manifest(composer_json)
|
|
||||||
repo_root = path.dirname(composer_json)
|
|
||||||
relative_path = path.relpath(dirname, repo_root)
|
|
||||||
|
|
||||||
autoloaders = _get_all_autoloaders(composer_manifest)
|
|
||||||
|
|
||||||
(namespace, remainder) = match_path(autoloaders, relative_path)
|
|
||||||
|
|
||||||
return namespace + convert_path(remainder)
|
|
||||||
|
|
||||||
def get_package_name(dirname):
|
|
||||||
'''Find package name from current location.'''
|
|
||||||
try:
|
|
||||||
composer_json = find_in_parent('composer.json', dirname)
|
|
||||||
except IOError:
|
|
||||||
return 'foo/bar'
|
|
||||||
composer_manifest = _parse_composer_manifest(composer_json)
|
|
||||||
name = _get_package_name(composer_manifest)
|
|
||||||
return name
|
|
||||||
|
|
||||||
def prepare_arguments(param_tags):
|
|
||||||
arguments = generate_arguments(param_tags)
|
|
||||||
|
|
||||||
def add_argument(snip):
|
|
||||||
'''Search for the next argument list, and insert one.
|
|
||||||
|
|
||||||
These arguments will be of the form
|
|
||||||
|
|
||||||
TypeName $variableName
|
|
||||||
|
|
||||||
and will come from the body the @param snippet:
|
|
||||||
|
|
||||||
* @param Typename $variableName Description
|
|
||||||
'''
|
|
||||||
buffer = snip.buffer
|
|
||||||
param_line_number = snip.snippet_start[0]
|
|
||||||
param_line = buffer[param_line_number]
|
|
||||||
try:
|
|
||||||
argument_line_number = find_argument_line_number(param_line_number, buffer)
|
|
||||||
except IndexError:
|
|
||||||
return
|
|
||||||
argument_line = buffer[argument_line_number]
|
|
||||||
argument = get_argument_line(param_line)
|
|
||||||
new_argument_line = insert_argument(argument, argument_line)
|
|
||||||
buffer[argument_line_number] = new_argument_line
|
|
||||||
|
|
||||||
def insert_argument(arg, line):
|
|
||||||
insert_point = line.find(')')
|
|
||||||
|
|
||||||
# No arguments yet, so no comma
|
|
||||||
if line[insert_point - 1] is '(':
|
|
||||||
return line[:insert_point] + arg + line[insert_point:]
|
|
||||||
else:
|
|
||||||
return line[:insert_point] + ', ' + arg + line[insert_point:]
|
|
||||||
|
|
||||||
def find_argument_line_number(start, buffer):
|
|
||||||
for line_number, line in enumerate(buffer[start:]):
|
|
||||||
if line.endswith('*/'):
|
|
||||||
return line_number + 1 + start
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
raise IndexError('Could not find end of comment and start of method')
|
|
||||||
|
|
||||||
def format_method(snip):
|
|
||||||
'''Convert expanded snippet into method name and args.'''
|
|
||||||
params = get_params_map(snip)
|
|
||||||
|
|
||||||
if len(params) is 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
sorted_params = sort_params(params.values())
|
|
||||||
|
|
||||||
delete_param_tags(snip, params)
|
|
||||||
place_to_insert_params = snip.snippet_start[0] + list(params.keys())[0]
|
|
||||||
snip.buffer[place_to_insert_params:place_to_insert_params] = sorted_params
|
|
||||||
|
|
||||||
arguments = generate_arguments(sorted_params)
|
|
||||||
arguments[-1] = arguments[-1].replace(',', '')
|
|
||||||
args_line = snip.snippet_end[0] - 3
|
|
||||||
snip.buffer[args_line:args_line + 1] = arguments
|
|
||||||
|
|
||||||
def delete_param_tags(snip, params):
|
|
||||||
'''Sort @param PHPDoc tags so optional ones come later.'''
|
|
||||||
for idx, relative_line_number in enumerate(params.keys()):
|
|
||||||
# Have to subtract idx, because we are removing a line each time.
|
|
||||||
line_number = relative_line_number + snip.snippet_start[0] - idx
|
|
||||||
snip.buffer[line_number:line_number + 1] = []
|
|
||||||
|
|
||||||
def get_params_map(snip):
|
|
||||||
'''Get a map of @param PHPDoc tags, line_number: line.'''
|
|
||||||
lines = get_snippet_lines(snip)
|
|
||||||
return OrderedDict([[k, v] for k, v in enumerate(lines) if '@param' in v])
|
|
||||||
|
|
||||||
def generate_arguments(params):
|
|
||||||
'''Generate the function arguments from PHPDoc @params.'''
|
|
||||||
return [get_argument_line(x) for x in params]
|
|
||||||
|
|
||||||
def sort_params(params):
|
|
||||||
'''Sort params to put optional arguments at the end.'''
|
|
||||||
def sorter(left, right):
|
|
||||||
[left_is_optional, right_is_optional] = \
|
|
||||||
[is_union_with_null(x) for x in [left, right]]
|
|
||||||
|
|
||||||
if (left_is_optional and not right_is_optional):
|
|
||||||
return 1
|
|
||||||
if (not left_is_optional and right_is_optional):
|
|
||||||
return -1
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
return sorted(params, key=cmp_to_key(sorter))
|
|
||||||
|
|
||||||
def get_snippet_lines(snip):
|
|
||||||
'''Get the relevant slice of a snippet buffer.'''
|
|
||||||
start_line = snip.snippet_start[0]
|
|
||||||
finish_line = snip.snippet_end[0]
|
|
||||||
return snip.buffer[start_line:finish_line]
|
|
||||||
|
|
||||||
def get_argument_line(param):
|
|
||||||
'''Convert line from @param tag to method parameter.'''
|
|
||||||
expression = '\s*\*\s+@param\s+([^\s]+)\s+(\$[^\s]+).*'
|
|
||||||
result = re.search(expression, param)
|
|
||||||
|
|
||||||
type = map_type(result.group(1))
|
|
||||||
name = result.group(2)
|
|
||||||
|
|
||||||
return format_argument_line(type, name)
|
|
||||||
|
|
||||||
def map_type(type):
|
|
||||||
'''Convert PHPDoc type declaration into a PHP type hint.'''
|
|
||||||
if (is_union_with_null(type)):
|
|
||||||
return map_type(type.replace('|null', ''))
|
|
||||||
if (is_union_type(type)):
|
|
||||||
# PHP doesn't support union type hints yet.
|
|
||||||
return None
|
|
||||||
if (is_array_type(type)):
|
|
||||||
# PHP doesn't have complex generics yet.
|
|
||||||
return 'array'
|
|
||||||
# A plain type
|
|
||||||
return type
|
|
||||||
|
|
||||||
def is_union_with_null(type):
|
|
||||||
'''Test if PHPDoc type has a null option.'''
|
|
||||||
return '|null' in type
|
|
||||||
|
|
||||||
def is_union_type(type):
|
|
||||||
'''Test if PHPDoc type is any kind of union.'''
|
|
||||||
return '|' in type
|
|
||||||
|
|
||||||
def is_array_type(type):
|
|
||||||
'''Test if PHPDoc type is an array...'''
|
|
||||||
return '[]' in type
|
|
||||||
|
|
||||||
def format_argument_line(type, name):
|
|
||||||
if (type is None):
|
|
||||||
return name
|
|
||||||
else:
|
|
||||||
return '{} {}'.format(type, name)
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue