Skip to content

Commit

Permalink
Fix functionto fidn start and end lines
Browse files Browse the repository at this point in the history
  • Loading branch information
lyriccoder committed Jul 14, 2020
1 parent e66e288 commit 2862ab3
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 6 deletions.
23 changes: 17 additions & 6 deletions aibolit/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,18 +227,29 @@ def find_annotation_by_node_type(
def find_start_and_end_lines(node) -> Tuple[int, int]:
max_line = node.position.line

def check_max_position(node):
nonlocal max_line
if hasattr(node, '_position'):
if node.position.line > max_line:
max_line = node.position.line

def traverse(node):
nonlocal max_line
check_max_position(node)

if hasattr(node, 'children'):
for child in node.children:
if isinstance(child, list) and (len(child) > 0):
for item in child:
traverse(item)
else:
if hasattr(child, '_position'):
nonlocal max_line
if child._position.line > max_line:
max_line = child._position.line
return
if hasattr(child, 'children'):
infants = child.children
for infant in infants:
traverse(infant)
else:
check_max_position(child)

else:
return

Expand Down Expand Up @@ -753,7 +764,7 @@ def run_thread(files, args):

def get_versions(pkg_name):
url = f'https://pypi.python.org/pypi/{pkg_name}/json'
releases = json.loads(requests.get(url).content)['releases']
releases = json.loads(requests.get(url, timeout=1).content)['releases']
return sorted(releases, key=parse_version, reverse=True)


Expand Down
68 changes: 68 additions & 0 deletions test/recommend/start_end/UpDirective.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (c) 2013-2020, xembly.org
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met: 1) Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer. 2) Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution. 3) Neither the name of the xembly.org nor
* the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.xembly;

import java.util.Collection;
import java.util.HashSet;
import lombok.EqualsAndHashCode;
import org.w3c.dom.Node;

/**
* UP directive.
*
* <p>The class is immutable and thread-safe.
*
* @since 0.1
*/
@EqualsAndHashCode
final class UpDirective implements Directive {

@Override
@SuppressWarnings("aibolit.P13")
public Directive.Cursor exec(final Node dom,
final Directive.Cursor cursor, final Directive.Stack stack)
throws ImpossibleModificationException {
final Collection<Node> parents = new HashSet<>(cursor.size());
for (final Node node : cursor) {
final Node parent = node.getParentNode();
if (parent == null) {
throw new ImpossibleModificationException(
String.format(
"there is no parent node of '%s' (%s), can't go UP",
node.getNodeName(), node.getNodeType()
)
);
}
parents.add(parent);
}
return new DomCursor(parents);
}

}
9 changes: 9 additions & 0 deletions test/recommend/test_recommend_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,15 @@ def test_find_start_end_line_empty_function_in_anonymous_class(self):
self.assertEqual(start, 37)
self.assertEqual(end, 38)

def test_find_start_end_line_in_function2(self):
file = Path(self.cur_file_dir, 'start_end/UpDirective.java')
with open(file, 'r', encoding='utf-8') as f:
tree = javalang.parse.parse(f.read())
method = list(tree.filter(javalang.tree.MethodDeclaration))[0][1]
start, end = find_start_and_end_lines(method)
self.assertEqual(start, 49)
self.assertEqual(end, 65)

def test_find_start_end_line_in_class(self):
file = Path(self.cur_file_dir, 'start_end/LottieImageAsset.java')
with open(file, 'r', encoding='utf-8') as f:
Expand Down

0 comments on commit 2862ab3

Please sign in to comment.