codemodels 0.2.6-java → 0.2.7-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f078cf79663958cdc1389096405686a03dff12fc
4
- data.tar.gz: e7890ba70b6e10f9167feecb8ac24e8f43f7c3a2
3
+ metadata.gz: 5a2687b4c80653a5757086fcd1c7eafa187d3321
4
+ data.tar.gz: e33b1d14fb8a3463b0bb9c2e6fee8e3501cfb926
5
5
  SHA512:
6
- metadata.gz: bdc1e5a07416951f7c2b21467e1a4c0f5d0dd376492288204226dbe8ebea9d64bc86ed78cf270b9320d39965ba43c211294c41c037e86fc1309bcb71655d0b57
7
- data.tar.gz: 0d70721939e39ea3be3d2a2be7b36a0c473e045c73798d213f75b9286bae3b69bae521b8f5fa096cffb6e55d6f4519324c43ce370874445e110185993671a03a
6
+ metadata.gz: 77c41350b27ae2be3e258154227e951325ee120ebfad6db08624b34106702e1232996f78e66aedcf31637b20fe5d2243628f489448990125ed88b4be8cf1e379
7
+ data.tar.gz: e006252eabfea9c26d342795faa62b14da3be41dab18eb397d5a10a399ac5b47fb71469b9d9235ace6120ddfb71337748308735ee19378d43fc89e940d256c71
@@ -19,12 +19,13 @@ Gem::Specification.new do |s|
19
19
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency('json')
23
- s.add_dependency('rgen')
24
- s.add_dependency('rgen_ext','0.0.2')
22
+ s.add_dependency 'json', '~> 1.8'
23
+ s.add_dependency 'rgen', '~> 0.6.6'
24
+ s.add_dependency 'rgen_ext','0.0.2'
25
25
 
26
- s.add_development_dependency "bundler"
27
- s.add_development_dependency "rake"
28
- s.add_development_dependency "simplecov"
29
- s.add_development_dependency "rubygems-tasks"
26
+ s.add_development_dependency 'bundler'
27
+ s.add_development_dependency 'rake'
28
+ s.add_development_dependency 'simplecov'
29
+ s.add_development_dependency 'rubygems-tasks', '~> 0.2.4'
30
+ s.add_development_dependency 'yard', '~> 0.8.7'
30
31
  end
@@ -3,8 +3,16 @@ require 'codemodels/position'
3
3
 
4
4
  module CodeModels
5
5
 
6
- class AbstractArtifact
6
+ # An artifact is everything that
7
+ # can contain code
8
+ class Artifact
7
9
 
10
+ def initialize
11
+ raise "You should not use Artifact directly" if self.class==Artifact
12
+ end
13
+
14
+ # @param point a point relative to this artifact
15
+ # @return the same point specified in respect to the absolute artifact
8
16
  def point_to_absolute(point)
9
17
  offset = absolute_start
10
18
  p = SourcePoint.new
@@ -14,6 +22,8 @@ class AbstractArtifact
14
22
  p
15
23
  end
16
24
 
25
+ # @param position a position relative to this artifact
26
+ # @return the same position specified in respect to the absolute artifact
17
27
  def position_to_absolute(position)
18
28
  pos = SourcePosition.new
19
29
  pos.begin_point = point_to_absolute(position.begin_point)
@@ -23,7 +33,8 @@ class AbstractArtifact
23
33
 
24
34
  end
25
35
 
26
- class EmbeddedArtifact < AbstractArtifact
36
+ # Represent a snippet embedded in something else
37
+ class EmbeddedArtifact < Artifact
27
38
  attr_accessor :host_artifact
28
39
  attr_accessor :position_in_host
29
40
 
@@ -67,7 +78,7 @@ class EmbeddedArtifact < AbstractArtifact
67
78
 
68
79
  end
69
80
 
70
- class FileArtifact < AbstractArtifact
81
+ class FileArtifact < Artifact
71
82
  attr_reader :filename
72
83
  attr_reader :code
73
84
 
@@ -114,7 +125,7 @@ class FileArtifact < AbstractArtifact
114
125
 
115
126
  end
116
127
 
117
- class StringArtifact < AbstractArtifact
128
+ class StringArtifact < Artifact
118
129
  attr_reader :code
119
130
 
120
131
  def initialize(code)
@@ -1,3 +1,5 @@
1
+ require 'pathname'
2
+
1
3
  # encoding: utf-8
2
4
  module CodeModels
3
5
 
@@ -5,18 +7,21 @@ module CodeModels
5
7
 
6
8
  class Language
7
9
  attr_reader :name
10
+ attr_reader :filenames
8
11
  attr_reader :extensions
9
12
  attr_reader :parser
10
13
 
11
14
  def initialize(name)
12
15
  @name = name
13
16
  @extensions = []
17
+ @filenames = []
14
18
  end
15
19
 
16
20
  def can_parse?(path)
21
+ simple_name = Pathname.new(path).basename.to_s
17
22
  extension = File.extname(path)
18
23
  extension=extension[1..-1] if extension.length>0
19
- @extensions.include?(extension)
24
+ @extensions.include?(extension) || @filenames.include?(simple_name)
20
25
  end
21
26
 
22
27
  end
@@ -31,17 +36,19 @@ def self.registered_languages
31
36
  @@languages
32
37
  end
33
38
 
34
- class NoLanguageRegistered < Exception
39
+ class NoLanguageRegisteredError < StandardError
35
40
  attr_reader :path
36
41
 
37
42
  def initialize(path)
43
+ super("No language registered to parse #{path}")
38
44
  @path = path
39
45
  end
46
+
40
47
  end
41
48
 
42
49
  def self.parse_file(path)
43
50
  l = @@languages.find {|l| l.can_parse?(path) }
44
- raise NoLanguageRegistered.new(path) unless l
51
+ raise NoLanguageRegisteredError.new(path) unless l
45
52
  l.parser.parse_file(path)
46
53
  end
47
54
 
@@ -3,7 +3,8 @@ require 'codemodels/serialization'
3
3
 
4
4
  module CodeModels
5
5
 
6
- class FilesSource
6
+ # Filter all files in a directory by extension
7
+ class FilesFilter
7
8
 
8
9
  def initialize(dir,extension)
9
10
  @dir = dir
@@ -1,6 +1,8 @@
1
1
  # encoding: UTF-8
2
2
  class Module
3
3
 
4
+ # It gives the simple name of a Module.
5
+ # If the name of contains a colon, it returns the part after the last colon.
4
6
  def simple_name
5
7
  if (i = (r = name).rindex(':')) then r[0..i] = '' end
6
8
  r
@@ -1,8 +1,11 @@
1
1
  # encoding: UTF-8
2
2
  module CodeModels
3
3
 
4
+ # The flag :also_foreign deciced if to consider the
5
+ # AST of embedded code
4
6
  module NavigationExtensions
5
7
 
8
+ # All direct children
6
9
  def all_children(flag=nil)
7
10
  also_foreign = (flag==:also_foreign)
8
11
  arr = []
@@ -11,7 +14,6 @@ module NavigationExtensions
11
14
  # two references with the same name are found
12
15
  already_used_references = []
13
16
  ecore.eAllReferences.sort_by{|r| r.name}.select {|r| r.containment}.each do |ref|
14
- #raise "Too many features with name #{ref.name}. Count: #{features_by_name(ref.name).count}" if features_by_name(ref.name).count!=1
15
17
  unless already_used_references.include?(ref.name)
16
18
  res = self.send(ref.name.to_sym)
17
19
  if ref.many
@@ -32,6 +34,7 @@ module NavigationExtensions
32
34
  arr
33
35
  end
34
36
 
37
+ # All direct and indirect children
35
38
  def all_children_deep(flag=nil)
36
39
  arr = []
37
40
  all_children(flag).each do |c|
@@ -43,6 +46,8 @@ module NavigationExtensions
43
46
  arr
44
47
  end
45
48
 
49
+ # Execute an operation on the node itself and all children,
50
+ # direct and indirect.
46
51
  def traverse(flag=nil,&op)
47
52
  op.call(self)
48
53
  all_children_deep(flag).each do |c|
@@ -50,14 +55,20 @@ module NavigationExtensions
50
55
  end
51
56
  end
52
57
 
58
+ # All the values considering the node,
59
+ # and the direct and indirect children (if :deep is contained in flags).
60
+ # In that case the presence of :also_foreign determine if also embedded
61
+ # ASTs are considrered
53
62
  def values_map(flags=nil)
63
+ raise ":also_foreign makes sense only when :deep is used" if flags.include?(:also_foreign) && !flags.include?(:deep)
54
64
  if flags.include?(:deep)
55
- collect_values_with_count_subtree(flags[:also_foreign])
65
+ collect_values_with_count_subtree(flags.include?(:also_foreign)?(:also_foreign):nil)
56
66
  else
57
67
  collect_values_with_count
58
68
  end
59
69
  end
60
70
 
71
+ # Deprecated, use values_map instead
61
72
  def collect_values_with_count
62
73
  values = Hash.new {|h,k| h[k]=0}
63
74
  self.class.ecore.eAllAttributes.each do |a|
@@ -73,6 +84,7 @@ module NavigationExtensions
73
84
  values
74
85
  end
75
86
 
87
+ # Deprecated, use values_map instead
76
88
  def collect_values_with_count_subtree(flag=nil)
77
89
  values = collect_values_with_count
78
90
  all_children_deep(flag).each do |c|
@@ -103,9 +115,10 @@ module NavigationExtensions
103
115
  selected[0]
104
116
  end
105
117
 
118
+ # Parent of the node.
119
+ # A foreign child could have its own parent in the foreign ast, which is not part of the complexive AST
120
+ # the foreign parent has therefore the precedence.
106
121
  def container(flag=nil)
107
- # a foreign child could have its own parent in the foreign ast, which is not part of the complexive AST
108
- # the foreign parent has therefore the precedence.
109
122
  also_foreign = (flag==:also_foreign)
110
123
  if also_foreign && self.foreign_container
111
124
  return self.foreign_container
@@ -127,10 +140,12 @@ module NavigationExtensions
127
140
  all_children_deep(:also_foreign)
128
141
  end
129
142
 
143
+ # Deprecated
130
144
  def traverse_also_foreign(&block)
131
145
  traverse(:also_foreign,&block)
132
146
  end
133
147
 
148
+ # Deprecated
134
149
  def container_also_foreign
135
150
  container(:also_foreign)
136
151
  end
@@ -4,54 +4,67 @@ require 'codemodels/monkey_patching'
4
4
 
5
5
  module CodeModels
6
6
 
7
+ # A parser get code and produce an AST
8
+ #
9
+ # Sub-classes should provide internal_parse_artifact
7
10
  class Parser
8
11
 
9
12
  DEFAULT_INTERNAL_ENCODING = 'UTF-8'
10
13
 
14
+ # Internal encoding.
15
+ # Code is internally converted to this encoding.
11
16
  attr_reader :internal_encoding
12
17
 
13
18
  def initialize(internal_encoding=DEFAULT_INTERNAL_ENCODING)
14
19
  @internal_encoding = internal_encoding
15
20
  puts "WARN using an internal encoding different from the local encoding..." if "".encoding.name!=internal_encoding
21
+ raise "The method internal_parse_artifact should be implemented" unless self.respond_to?(:internal_parse_artifact)
16
22
  end
17
23
 
18
24
  def parse_artifact(artifact)
19
25
  internal_parse_artifact(artifact)
20
26
  end
21
27
 
28
+ # Parse the file by producing an artifact corresponding to the file
22
29
  def parse_file(path,file_encoding=nil)
23
30
  file_encoding = internal_encoding unless file_encoding
24
31
  code = IO.read(path,{ :encoding => file_encoding, :mode => 'rb'})
25
32
  code = code.encode(internal_encoding)
26
33
  artifact = FileArtifact.new(path,code)
27
- internal_parse_artifact(artifact)
28
- end
29
-
30
- # Deprecated: use parse_string
31
- def parse_code(code)
32
- parse_string(code)
34
+ parse_artifact(artifact)
33
35
  end
34
36
 
37
+ # Parse the file by producing an artifact corresponding to the string
35
38
  def parse_string(code)
36
39
  raise "Wrong encoding: it is #{code.encoding.name}, internally expected #{internal_encoding}" unless code.encoding.name==internal_encoding
37
40
  artifact = StringArtifact.new(code)
38
- internal_parse_artifact(artifact)
41
+ parse_artifact(artifact)
39
42
  end
40
43
 
41
44
  end
42
45
 
43
- class ParsingError < Exception
46
+ class ParsingError < StandardError
44
47
  attr_reader :node
45
48
  attr_reader :line
49
+ attr_reader :column
46
50
 
47
- def initialize(node,msg,line=nil)
51
+ def initialize(node,msg,line=nil,column=nil)
52
+ super("Parsing error: #{msg}")
48
53
  @node = node
49
54
  @msg = msg
50
55
  @line = line
56
+ @column = column
57
+ raise "If column is specified also line should be" if line==nil and column!=nil
51
58
  end
52
59
 
53
60
  def to_s
54
- "#{@msg}, start line: #{@line}"
61
+ if @line and @column
62
+ "Parsing error: #{@msg}, node: #{node}, line: #{@line}, column: #{column}"
63
+ elsif @line
64
+ "Parsing error: #{@msg}, node: #{node}, line: #{@line}"
65
+ else
66
+ "Parsing error: #{@msg}, node: #{node}"
67
+ end
55
68
  end
56
69
 
57
70
  end
@@ -60,10 +73,14 @@ end
60
73
  # wrapping another parser and adapting it
61
74
  # to CodeModels. When they encounter a node type
62
75
  # they do not know how to wrap this error is thrown.
76
+ #
63
77
  # This is not just for java based parsers, so it should
64
78
  # be not moved to codemodels-javaparserwrapper
65
79
  class UnknownNodeType < ParsingError
66
80
 
81
+ # @param node the node that can not be translated
82
+ # @param node_type node that is not understood
83
+ # @param where describe where the node was contained (artifact, line, column)
67
84
  def initialize(node,line=nil,node_type=nil,where=nil)
68
85
  super(node,"UnknownNodeType: type=#{node_type} , where: #{where}")
69
86
  end
@@ -2,11 +2,17 @@
2
2
 
3
3
  module CodeModels
4
4
 
5
+ # Point in an artifact, indicated by line and column
6
+ # The newlines are considered as column 0 of the next line.
7
+ # Lines should be always positive and all but newlines should have
8
+ # columns positive (>0)
5
9
  class SourcePoint
6
10
  include Comparable
7
11
 
8
12
  attr_accessor :line, :column
9
13
 
14
+ # @param [String code]
15
+ # @param [int index] index of the starting character in the code
10
16
  def self.from_code_index(code,index)
11
17
  l = line(code,index)
12
18
  c = column(code,index)
@@ -50,18 +56,6 @@ class SourcePoint
50
56
  index+=@column
51
57
  index-=1
52
58
  index
53
-
54
- # current_line = lines.next
55
- # i=0
56
- # c=0
57
- # while c<@column
58
- # c += current_line[i]=='\t' ? COLUMNS_FOR_TAB : 1
59
- # i += 1
60
- # end
61
-
62
- # index+=c
63
- # index-=1
64
- # index
65
59
  end
66
60
 
67
61
  def <=>(other)
@@ -90,6 +84,7 @@ class SourcePoint
90
84
  end
91
85
  end
92
86
 
87
+ # A position is a pair of a begin and an end point
93
88
  class SourcePosition
94
89
  attr_accessor :begin_point, :end_point
95
90
 
@@ -112,6 +107,17 @@ class SourcePosition
112
107
  @begin_point.column = column
113
108
  end
114
109
 
110
+ def end_line=(line)
111
+ @end_point=SourcePoint.new unless @end_point
112
+ @end_point.line = line
113
+ end
114
+
115
+ def end_column=(column)
116
+ @end_point=SourcePoint.new unless @end_point
117
+ @end_point.column = column
118
+ end
119
+
120
+
115
121
  def eql?(other)
116
122
  return false unless other.respond_to?(:begin_point)
117
123
  return false unless other.respond_to?(:end_point)
@@ -126,10 +132,15 @@ class SourcePosition
126
132
  "from #{@begin_point} to #{@end_point}"
127
133
  end
128
134
 
129
- def get_string(s)
130
- as = @begin_point.to_absolute_index(s)
131
- ae = @end_point.to_absolute_index(s)
132
- s[as..ae]
135
+ # Deprecated, use get_code instead
136
+ def get_string(artifact_code)
137
+ get_code(artifact_code)
138
+ end
139
+
140
+ def get_code(artifact_code)
141
+ as = @begin_point.to_absolute_index(artifact_code)
142
+ ae = @end_point.to_absolute_index(artifact_code)
143
+ artifact_code[as..ae]
133
144
  end
134
145
 
135
146
  def begin_line
@@ -1,18 +1,24 @@
1
1
  # encoding: utf-8
2
2
 
3
- # This code permit to transform AstNode in Hash objects
4
- # containing lists and single values
5
-
6
3
  require 'json'
7
4
  require 'fileutils'
8
5
  require 'rgen/metamodel_builder'
9
6
 
10
7
  module CodeModels
8
+
9
+ # Everything related to serialization to Hash, lists and basic values
10
+ # is contained in this module
11
11
  module Serialization
12
12
 
13
+ # Intended to be included
13
14
  module SerializationFunctionalities
14
15
 
16
+ # Deprecated, use to_hash instead
15
17
  def to_json(params={})
18
+ to_hash(params)
19
+ end
20
+
21
+ def to_hash(params={})
16
22
  serialization_memory = params.fetch(:memory,SerializationMemory.new)
17
23
  adapters = params.fetch(:adapters,{})
18
24
  with_source_info = params.fetch(:source_info,true)
@@ -21,15 +27,15 @@ module SerializationFunctionalities
21
27
  map = { 'type' => type, 'id' => serialization_memory.id(e_object) }
22
28
  if with_source_info
23
29
  if self.respond_to?(:source) && self.source
24
- map['source'] = source_info_to_json(self.source)
30
+ map['source'] = source_info_to_hash(self.source)
25
31
  end
26
32
  end
27
33
  e_class = e_object.class.ecore
28
34
  e_class.eAllAttributes.sort_by { |a| a.name }.each do |a|
29
- jsonize_attr_value(map,a)
35
+ insert_attr_value_in_hash(map,a)
30
36
  end
31
37
  e_class.eAllReferences.sort_by { |r| r.name }.each do |r|
32
- id = jsonize_ref_value(map,r,adapters,serialization_memory)
38
+ id = insert_ref_value_in_hash(map,r,adapters,serialization_memory)
33
39
  end
34
40
  if adapters.has_key? type
35
41
  adapters[type].adapt(self,map)
@@ -39,7 +45,7 @@ module SerializationFunctionalities
39
45
 
40
46
  private
41
47
 
42
- def source_info_to_json(source_info)
48
+ def source_info_to_hash(source_info)
43
49
  source_map = {}
44
50
  if self.source.begin_point
45
51
  source_map['begin_point'] = {'line'=> self.source.begin_point.line, 'column'=>self.source.begin_point.column}
@@ -54,7 +60,7 @@ module SerializationFunctionalities
54
60
  self.class.to_s
55
61
  end
56
62
 
57
- def jsonize_attr_value(map,e_attr)
63
+ def insert_attr_value_in_hash(map,e_attr)
58
64
  value = self.send(e_attr.name.to_sym)
59
65
  unless e_attr.many
60
66
  map["attr_#{e_attr.name}"] = value
@@ -67,24 +73,24 @@ module SerializationFunctionalities
67
73
  end
68
74
  end
69
75
 
70
- def jsonize_ref_value(map,e_ref,adapters,serialization_memory)
76
+ def insert_ref_value_in_hash(map,e_ref,adapters,serialization_memory)
71
77
  value = self.send e_ref.name.to_sym
72
78
 
73
79
  propname = "relcont_#{e_ref.name}" if e_ref.containment
74
80
  propname = "relnoncont_#{e_ref.name}" if not e_ref.containment
75
81
 
76
82
  unless e_ref.many
77
- map[propname] = jsonize_ref_single_el(value,e_ref.containment,adapters,serialization_memory)
83
+ map[propname] = insert_ref_single_value_in_hash(value,e_ref.containment,adapters,serialization_memory)
78
84
  else
79
85
  l = []
80
86
  (0...(value.size)).each do |i|
81
- l << jsonize_ref_single_el(value.at(i),e_ref.containment,adapters,serialization_memory)
87
+ l << insert_ref_single_value_in_hash(value.at(i),e_ref.containment,adapters,serialization_memory)
82
88
  end
83
89
  map[propname] = l
84
90
  end
85
91
  end
86
92
 
87
- def jsonize_ref_single_el(single_value,containment,adapters,serialization_memory)
93
+ def insert_ref_single_value_in_hash(single_value,containment,adapters,serialization_memory)
88
94
  if containment
89
95
  single_value.to_json(memory:serialization_memory,adapters:adapters)
90
96
  else
@@ -7,6 +7,13 @@ require 'codemodels/artifact'
7
7
 
8
8
  module CodeModels
9
9
 
10
+ # Info which specify from which part of the code a node was
11
+ # obtained.
12
+ #
13
+ # Some methods can accept a scope to be :relative or :absolute.
14
+ # When a piece of code derives from some embedded snipped (e.g., a piece of JS in html file)
15
+ # the relative position is specified in respect to the snippet, while the absolute
16
+ # in respect to the containing file.
10
17
  class SourceInfo
11
18
  attr_accessor :artifact
12
19
  attr_accessor :position
@@ -31,46 +38,48 @@ class SourceInfo
31
38
  @position = value
32
39
  end
33
40
 
41
+ # @param data is expected to be an hash with :line and :column
34
42
  def begin_point=(data)
35
43
  point = data_to_point(data)
36
44
  @position = SourcePosition.new unless @position
37
45
  @position.begin_point = point
38
46
  end
39
47
 
48
+ # @param data is expected to be an hash with :line and :column
40
49
  def end_point=(data)
41
50
  point = data_to_point(data)
42
51
  @position = SourcePosition.new unless @position
43
52
  @position.end_point = point
44
53
  end
45
54
 
46
- def begin_line(flag=:relative)
47
- position.begin_point.line
55
+ def begin_line(scope=:relative)
56
+ position(scope).begin_point.line
48
57
  end
49
58
 
50
- def end_line(flag=:relative)
51
- position(flag).end_point.line
59
+ def end_line(scope=:relative)
60
+ position(scope).end_point.line
52
61
  end
53
62
 
54
- def begin_column(flag=:relative)
55
- position(flag).begin_point.column
63
+ def begin_column(scope=:relative)
64
+ position(scope).begin_point.column
56
65
  end
57
66
 
58
67
  def end_column(flag=:relative)
59
- position(flag).end_point.column
68
+ position(scope).end_point.column
60
69
  end
61
70
 
62
- def begin_point(flag=:relative)
63
- position(flag).begin_point
71
+ def begin_point(scope=:relative)
72
+ position(scope).begin_point
64
73
  end
65
74
 
66
- def end_point(flag=:relative)
67
- position(flag).end_point
75
+ def end_point(scope=:relative)
76
+ position(scope).end_point
68
77
  end
69
78
 
70
- def position(flag=:relative)
71
- value = if flag==:relative
79
+ def position(scope=:relative)
80
+ value = if scope==:relative
72
81
  @position
73
- elsif flag==:absolute
82
+ elsif scope==:absolute
74
83
  absolute_position
75
84
  else
76
85
  raise "unvalid value #{flag}"
@@ -79,6 +88,7 @@ class SourceInfo
79
88
  value
80
89
  end
81
90
 
91
+ # Deprecated, use position(:absolute) instead
82
92
  def absolute_position
83
93
  raise "#{self} is not placed in any artifact" unless @artifact
84
94
  @artifact.position_to_absolute(@position)
@@ -115,14 +125,16 @@ module SourceInfoExtensions
115
125
  attr_accessor :language
116
126
  attr_accessor :source
117
127
 
118
- def set_start_point(data)
128
+ # @param data is expected to be an hash with :line and :column
129
+ def start_point=(data)
119
130
  @source = SourceInfo.new unless @source
120
- @source.set_start_point(data)
131
+ @source.start_point = data
121
132
  end
122
133
 
123
- def set_end_point(data)
134
+ # @param data is expected to be an hash with :line and :column
135
+ def end_point=(data)
124
136
  @source = SourceInfo.new unless @source
125
- @source.set_end_point(data)
137
+ @source.end_point = data
126
138
  end
127
139
  end
128
140
 
@@ -134,6 +146,7 @@ module ForeignAstExtensions
134
146
 
135
147
  attr_accessor :foreign_container
136
148
 
149
+ # The name is to maintain similarity with RGen (so we used camelcase instead of underscore)
137
150
  def addForeign_asts(foreign_ast)
138
151
  foreign_asts << foreign_ast
139
152
  foreign_ast.foreign_container = self
@@ -145,14 +158,16 @@ module ForeignAstExtensions
145
158
  end
146
159
  end
147
160
 
161
+ # Deprecated
148
162
  module HostPositionExtensions
149
163
 
164
+ # Deprecated
150
165
  def absolute_position
166
+ puts "HostPositionExtensions is DEPRECATED"
151
167
  artifact = source.artifact
152
168
  artifact.absolute_position(source.position)
153
169
  end
154
170
 
155
171
  end
156
172
 
157
-
158
173
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module CodeModels
4
- VERSION = "0.2.6"
4
+ VERSION = "0.2.7"
5
5
  end
@@ -13,6 +13,15 @@ class MyLanguage < Language
13
13
  end
14
14
  end
15
15
 
16
+ class MyOtherLanguage < Language
17
+ def initialize(my_parser)
18
+ super('MyLanguage')
19
+ @filenames << 'pippo'
20
+ @parser = my_parser
21
+ end
22
+ end
23
+
24
+
16
25
  class MyParser
17
26
  attr_reader :invokations
18
27
 
@@ -39,9 +48,15 @@ def test_my_language
39
48
  assert l.parser.is_a?(MyParser)
40
49
  end
41
50
 
42
- def test_can_parse?
43
- assert_equal true, @my_language.can_parse?('pippo.my1')
44
- assert_equal false, @my_language.can_parse?('pippo.else')
51
+ def test_can_parse_extension?
52
+ assert_equal true, @my_language.can_parse?('a/dir/pippo.my1')
53
+ assert_equal false, @my_language.can_parse?('a/dir/pippo.else')
54
+ end
55
+
56
+ def test_can_parse_extension?
57
+ @l = MyOtherLanguage.new('MyOtherLanguage')
58
+ assert_equal true, @l.can_parse?('a/dir/pippo')
59
+ assert_equal false, @l.can_parse?('a/dir/pluto')
45
60
  end
46
61
 
47
62
  def test_parse_file_registered_language
@@ -50,7 +65,7 @@ def test_parse_file_registered_language
50
65
  end
51
66
 
52
67
  def test_parse_file_unregistered_language
53
- assert_raise NoLanguageRegistered do
68
+ assert_raise NoLanguageRegisteredError do
54
69
  CodeModels.parse_file('pippo.else')
55
70
  end
56
71
  end
@@ -18,6 +18,24 @@ class TestParser < Test::Unit::TestCase
18
18
 
19
19
  end
20
20
 
21
+ class ArtifactReturningParser < CodeModels::Parser
22
+
23
+ attr_reader :last_parser_artifact
24
+
25
+ def internal_parse_artifact(artifact)
26
+ @last_parser_artifact = artifact
27
+ Metamodel::SimpleText.build(artifact.code)
28
+ end
29
+
30
+ end
31
+
32
+ def test_parse_string
33
+ p = ArtifactReturningParser.new
34
+ p.parse_string("PIPPO")
35
+ assert p.last_parser_artifact.is_a?(StringArtifact)
36
+ assert_equal "PIPPO", p.last_parser_artifact.code
37
+ end
38
+
21
39
  def test_encoding
22
40
  text1 = "Füße laissé fenêtre Miško Minár ă î Timișoara"
23
41
  # ISO 8859-1 does not support all characters, so it is shorter
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codemodels
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: java
6
6
  authors:
7
7
  - Federico Tomassetti
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-01 00:00:00.000000000 Z
11
+ date: 2014-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
15
15
  version_requirements: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.8'
20
20
  requirement: !ruby/object:Gem::Requirement
21
21
  requirements:
22
- - - '>='
22
+ - - ~>
23
23
  - !ruby/object:Gem::Version
24
- version: '0'
24
+ version: '1.8'
25
25
  prerelease: false
26
26
  type: :runtime
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rgen
29
29
  version_requirements: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.6.6
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
- - - '>='
36
+ - - ~>
37
37
  - !ruby/object:Gem::Version
38
- version: '0'
38
+ version: 0.6.6
39
39
  prerelease: false
40
40
  type: :runtime
41
41
  - !ruby/object:Gem::Dependency
@@ -98,14 +98,28 @@ dependencies:
98
98
  name: rubygems-tasks
99
99
  version_requirements: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ~>
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: 0.2.4
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
- - - '>='
106
+ - - ~>
107
107
  - !ruby/object:Gem::Version
108
- version: '0'
108
+ version: 0.2.4
109
+ prerelease: false
110
+ type: :development
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.8.7
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ~>
121
+ - !ruby/object:Gem::Version
122
+ version: 0.8.7
109
123
  prerelease: false
110
124
  type: :development
111
125
  description: Library to build models of code of different languages in a uniform way.