ghazel-ffi-clang 0.2.0.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ # Copyright, 2014, by Masahiro Sano.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ module FFI
22
+ module Clang
23
+ module Lib
24
+ typedef :pointer, :CXCompilationDatabase
25
+ typedef :pointer, :CXCompileCommands
26
+ typedef :pointer, :CXCompileCommand
27
+
28
+ CompilationDatabaseError = enum [
29
+ :no_error, 0,
30
+ :can_not_load_database, 1,
31
+ ]
32
+
33
+ # CompilationDatabase
34
+ attach_function :compilation_database_from_directory, :clang_CompilationDatabase_fromDirectory, [:string, :pointer], :CXCompilationDatabase
35
+ attach_function :compilation_database_dispose, :clang_CompilationDatabase_dispose, [:CXCompilationDatabase], :uint
36
+ attach_function :compilation_database_get_compile_commands, :clang_CompilationDatabase_getCompileCommands, [:CXCompilationDatabase, :string], :CXCompileCommands
37
+ if FFI::Clang::Utils.satisfy_version?('3.3')
38
+ attach_function :compilation_database_get_all_compile_commands, :clang_CompilationDatabase_getAllCompileCommands, [:CXCompilationDatabase], :CXCompileCommands
39
+ end
40
+
41
+ # CompilationDatabase::CompileCommands
42
+ attach_function :compile_commands_dispose, :clang_CompileCommands_dispose, [:CXCompileCommands], :void
43
+ attach_function :compile_commands_get_size, :clang_CompileCommands_getSize, [:CXCompileCommands], :uint
44
+ attach_function :compile_commands_get_command, :clang_CompileCommands_getCommand, [:CXCompileCommands, :uint], :CXCompileCommand
45
+
46
+ # CompilationDatabase::CompileCommand
47
+ attach_function :compile_command_get_directory, :clang_CompileCommand_getDirectory, [:CXCompileCommand], CXString.by_value
48
+ attach_function :compile_command_get_num_args, :clang_CompileCommand_getNumArgs, [:CXCompileCommand], :uint
49
+ attach_function :compile_command_get_arg, :clang_CompileCommand_getArg, [:CXCompileCommand, :uint], CXString.by_value
50
+ if FFI::Clang::Utils.satisfy_version?('3.4')
51
+ # Thease functions are not exposed by libclang.so privided by packages.
52
+ # attach_function :compile_command_get_num_mapped_sources, :clang_CompileCommand_getNumMappedSources, [:CXCompileCommand], :uint
53
+ # attach_function :compile_command_get_mapped_source_path, :clang_CompileCommand_getMappedSourcePath, [:CXCompileCommand, :uint], CXString.by_value
54
+ # attach_function :compile_command_get_mapped_source_content, :clang_CompileCommand_getMappedSourceContent, [:CXCompileCommand, :uint], CXString.by_value
55
+ end
56
+ end
57
+ end
58
+ end
@@ -30,7 +30,7 @@ require 'ffi/clang/utils'
30
30
  module FFI
31
31
  module Clang
32
32
  module Lib
33
- enum :kind, [
33
+ enum :cursor_kind, [
34
34
  :cursor_unexposed_decl, 1,
35
35
  :cursor_struct, 2,
36
36
  :cursor_union, 3,
@@ -206,7 +206,7 @@ module FFI
206
206
 
207
207
  class CXCursor < FFI::Struct
208
208
  layout(
209
- :kind, :kind,
209
+ :kind, :cursor_kind,
210
210
  :xdata, :int,
211
211
  :data, [:pointer, 3]
212
212
  )
@@ -277,7 +277,7 @@ module FFI
277
277
  attach_function :get_canonical_cursor, :clang_getCanonicalCursor, [CXCursor.by_value], CXCursor.by_value
278
278
  attach_function :get_cursor_definition, :clang_getCursorDefinition, [CXCursor.by_value], CXCursor.by_value
279
279
  attach_function :get_specialized_cursor_template, :clang_getSpecializedCursorTemplate, [CXCursor.by_value], CXCursor.by_value
280
- attach_function :get_template_cursor_kind, :clang_getTemplateCursorKind, [CXCursor.by_value], :kind
280
+ attach_function :get_template_cursor_kind, :clang_getTemplateCursorKind, [CXCursor.by_value], :cursor_kind
281
281
 
282
282
  attach_function :get_translation_unit_cursor, :clang_getTranslationUnitCursor, [:CXTranslationUnit], CXCursor.by_value
283
283
  attach_function :cursor_get_translation_unit, :clang_Cursor_getTranslationUnit, [CXCursor.by_value], :CXTranslationUnit
@@ -296,19 +296,19 @@ module FFI
296
296
  attach_function :get_cursor_display_name, :clang_getCursorDisplayName, [CXCursor.by_value], CXString.by_value
297
297
  attach_function :get_cursor_spelling, :clang_getCursorSpelling, [CXCursor.by_value], CXString.by_value
298
298
  attach_function :get_cursor_usr, :clang_getCursorUSR, [CXCursor.by_value], CXString.by_value
299
- attach_function :get_cursor_kind_spelling, :clang_getCursorKindSpelling, [:kind], CXString.by_value
299
+ attach_function :get_cursor_kind_spelling, :clang_getCursorKindSpelling, [:cursor_kind], CXString.by_value
300
300
 
301
301
  attach_function :are_equal, :clang_equalCursors, [CXCursor.by_value, CXCursor.by_value], :uint
302
302
 
303
- attach_function :is_declaration, :clang_isDeclaration, [:kind], :uint
304
- attach_function :is_reference, :clang_isReference, [:kind], :uint
305
- attach_function :is_expression, :clang_isExpression, [:kind], :uint
306
- attach_function :is_statement, :clang_isStatement, [:kind], :uint
307
- attach_function :is_attribute, :clang_isAttribute, [:kind], :uint
308
- attach_function :is_invalid, :clang_isInvalid, [:kind], :uint
309
- attach_function :is_translation_unit, :clang_isTranslationUnit, [:kind], :uint
310
- attach_function :is_preprocessing, :clang_isPreprocessing, [:kind], :uint
311
- attach_function :is_unexposed, :clang_isUnexposed, [:kind], :uint
303
+ attach_function :is_declaration, :clang_isDeclaration, [:cursor_kind], :uint
304
+ attach_function :is_reference, :clang_isReference, [:cursor_kind], :uint
305
+ attach_function :is_expression, :clang_isExpression, [:cursor_kind], :uint
306
+ attach_function :is_statement, :clang_isStatement, [:cursor_kind], :uint
307
+ attach_function :is_attribute, :clang_isAttribute, [:cursor_kind], :uint
308
+ attach_function :is_invalid, :clang_isInvalid, [:cursor_kind], :uint
309
+ attach_function :is_translation_unit, :clang_isTranslationUnit, [:cursor_kind], :uint
310
+ attach_function :is_preprocessing, :clang_isPreprocessing, [:cursor_kind], :uint
311
+ attach_function :is_unexposed, :clang_isUnexposed, [:cursor_kind], :uint
312
312
 
313
313
  enum :child_visit_result, [:break, :continue, :recurse]
314
314
 
@@ -331,14 +331,8 @@ module FFI
331
331
  attach_function :get_cursor_hash, :clang_hashCursor, [CXCursor.by_value], :uint
332
332
 
333
333
  if FFI::Clang::Utils.satisfy_version?('3.3')
334
- begin
335
- attach_function :is_bit_field,:clang_Cursor_isBitField, [CXCursor.by_value], :uint
336
- rescue FFI::NotFoundError => e
337
- end
338
- begin
339
- attach_function :get_field_decl_bit_width, :clang_getFieldDeclBitWidth, [CXCursor.by_value], :int
340
- rescue FFI::NotFoundError => e
341
- end
334
+ attach_function :is_bit_field,:clang_Cursor_isBitField, [CXCursor.by_value], :uint
335
+ attach_function :get_field_decl_bit_width, :clang_getFieldDeclBitWidth, [CXCursor.by_value], :int
342
336
  end
343
337
 
344
338
  attach_function :get_overloaded_decl, :clang_getOverloadedDecl, [CXCursor.by_value, :uint], CXCursor.by_value
@@ -0,0 +1,32 @@
1
+ # Copyright, 2014, by Greg Hazel
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'ffi/clang/lib/file'
22
+ require 'ffi/clang/lib/source_location'
23
+
24
+ module FFI
25
+ module Clang
26
+ module Lib
27
+ # Source code inclusions:
28
+ callback :visit_inclusion_function, [:CXFile, :pointer, :uint, :pointer], :void
29
+ attach_function :get_inclusions, :clang_getInclusions, [:CXTranslationUnit, :visit_inclusion_function, :pointer], :void
30
+ end
31
+ end
32
+ end
@@ -138,18 +138,9 @@ module FFI
138
138
  attach_function :get_array_element_type ,:clang_getArrayElementType, [CXType.by_value], CXType.by_value
139
139
 
140
140
  if FFI::Clang::Utils.satisfy_version?('3.3')
141
- begin
142
- attach_function :type_get_align_of, :clang_Type_getAlignOf, [CXType.by_value], :long_long
143
- rescue FFI::NotFoundError => e
144
- end
145
- begin
146
- attach_function :type_get_size_of, :clang_Type_getSizeOf, [CXType.by_value], :long_long
147
- rescue FFI::NotFoundError => e
148
- end
149
- begin
150
- attach_function :type_get_offset_of, :clang_Type_getOffsetOf, [CXType.by_value, :string], :long_long
151
- rescue FFI::NotFoundError => e
152
- end
141
+ attach_function :type_get_align_of, :clang_Type_getAlignOf, [CXType.by_value], :long_long
142
+ attach_function :type_get_size_of, :clang_Type_getSizeOf, [CXType.by_value], :long_long
143
+ attach_function :type_get_offset_of, :clang_Type_getOffsetOf, [CXType.by_value, :string], :long_long
153
144
  end
154
145
 
155
146
  if FFI::Clang::Utils.satisfy_version?('3.4')
@@ -21,6 +21,7 @@
21
21
  # THE SOFTWARE.
22
22
 
23
23
  require 'ffi/clang/lib/translation_unit'
24
+ require 'ffi/clang/lib/inclusions'
24
25
  require 'ffi/clang/cursor'
25
26
  require 'ffi/clang/file'
26
27
  require 'ffi/clang/token'
@@ -109,6 +110,29 @@ module FFI
109
110
  Tokens.new(token_ptr.get_pointer(0), uint_ptr.get_uint(0), self)
110
111
  end
111
112
 
113
+ def code_complete(source_file, line, column, unsaved = [], opts = nil)
114
+ opts = CodeCompletion.default_code_completion_options if opts.nil?
115
+ unsaved_files = UnsavedFile.unsaved_pointer_from(unsaved)
116
+ option_bitmask = Lib.bitmask_from(Lib::CodeCompleteFlags, opts)
117
+ ptr = Lib.code_complete_at(self, source_file, line, column, unsaved_files, unsaved.length, option_bitmask)
118
+ CodeCompletion::Results.new ptr, self
119
+ end
120
+
121
+ def inclusions(&block)
122
+ adapter = Proc.new do |included_file, inclusion_stack, include_len, unused|
123
+ file = Lib.extract_string Lib.get_file_name(included_file)
124
+ cur_ptr = inclusion_stack
125
+ inclusions = []
126
+ include_len.times {
127
+ inclusions << SourceLocation.new(Lib::CXSourceLocation.new(cur_ptr))
128
+ cur_ptr += Lib::CXSourceLocation.size
129
+ }
130
+ block.call file, inclusions
131
+ end
132
+
133
+ Lib.get_inclusions(self, adapter, nil)
134
+ end
135
+
112
136
  class ResourceUsage < AutoPointer
113
137
  def initialize(resource_usage)
114
138
  # CXResourceUsage is returned by value and should be freed explicitly.
@@ -1,4 +1,5 @@
1
1
  # Copyright, 2014 by Masahiro Sano.
2
+ # Copyright, 2014 by Samuel Williams.
2
3
  #
3
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -23,35 +24,60 @@ require 'ffi/clang/lib/string'
23
24
 
24
25
  module FFI
25
26
  module Clang
26
- class Utils
27
+ module Utils
28
+ @@clang_version = nil
29
+
27
30
  def self.clang_version_string
28
31
  Lib.extract_string Lib.get_clang_version
29
32
  end
30
33
 
31
34
  def self.clang_version
32
- version = clang_version_string
33
- version.match(/based on LLVM (\d+\.\d+)/).values_at(1).first
35
+ unless @@clang_version
36
+ # Version string vary wildy:
37
+ # Ubuntu: "Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)"
38
+ # Mac OS X: "Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)"
39
+ # Linux: "clang version 3.3"
40
+
41
+ if parts = clang_version_string.match(/(?:clang version|based on LLVM) (\d+)\.(\d+)(svn)?/)
42
+ major = parts[1].to_i
43
+ minor = parts[2].to_i
44
+ rc = parts[3]
45
+
46
+ # Mac OS X currently reports support for 3.3svn, but this support is broken in some ways, so we revert it back to 3.2 which it supports completely.
47
+ if rc == 'svn'
48
+ minor -= 1
49
+ end
50
+
51
+ @@clang_version = [major, minor]
52
+
53
+ puts "Clang version detected: #{@@clang_version.inspect}"
54
+ else
55
+ abort "Invalid/unsupported clang version string."
56
+ end
57
+ end
58
+
59
+ return @@clang_version
34
60
  end
35
61
 
36
62
  def self.clang_version_symbol
37
- version = "clang_" + clang_version.tr('.', '_')
38
- version.intern
63
+ "clang_#{clang_version.join('_')}".to_sym
39
64
  end
40
65
 
41
66
  def self.clang_major_version
42
- version = clang_version_string
43
- version.match(/based on LLVM (\d+)\./).values_at(1).first.to_i
67
+ clang_version[0]
44
68
  end
45
69
 
46
70
  def self.clang_minor_version
47
- version = clang_version_string
48
- version.match(/based on LLVM \d+\.(\d+)/).values_at(1).first.to_i
71
+ clang_version[1]
49
72
  end
50
73
 
74
+ # Returns true if the current clang version is >= min version and optionally <= max_version
51
75
  def self.satisfy_version?(min_version, max_version = nil)
52
- Gem::Version.create(self.clang_version) >= Gem::Version.create(min_version) and
53
- (max_version.nil? or
54
- Gem::Version.create(self.clang_version) <= Gem::Version.create(max_version))
76
+ min_version = Gem::Version.create(min_version)
77
+ max_version = Gem::Version.create(max_version) if max_version
78
+ current_version = Gem::Version.create(self.clang_version.join('.'))
79
+
80
+ return (current_version >= min_version) && (!max_version || current_version <= max_version)
55
81
  end
56
82
  end
57
83
  end
@@ -21,6 +21,6 @@
21
21
 
22
22
  module FFI
23
23
  module Clang
24
- VERSION = "0.2.0.2"
24
+ VERSION = "0.2.1"
25
25
  end
26
26
  end
@@ -0,0 +1,179 @@
1
+ # Copyright, 2014, by Masahiro Sano.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'spec_helper'
22
+
23
+ describe CodeCompletion do
24
+ let(:filename) { fixture_path("completion.cxx") }
25
+ let(:tu) { Index.new.parse_translation_unit(filename) }
26
+ let(:line) { 7 }
27
+ let(:column) { 6 }
28
+ let(:results) { tu.code_complete(filename, line, column) }
29
+
30
+ describe "self.default_code_completion_options" do
31
+ let(:options) { FFI::Clang::CodeCompletion.default_code_completion_options }
32
+ it "returns a default set of code-completion options" do
33
+ expect(options).to be_kind_of(Hash)
34
+ options.keys.each { |key|
35
+ expect(FFI::Clang::Lib::CodeCompleteFlags.symbols).to include(key)
36
+ }
37
+ end
38
+ end
39
+
40
+ describe CodeCompletion::Results do
41
+ it "can be obtained from a translation unit" do
42
+ expect(results).to be_kind_of(CodeCompletion::Results)
43
+ expect(results.size).to eq(42)
44
+ expect(results.results).to be_kind_of(Array)
45
+ expect(results.results.first).to be_kind_of(CodeCompletion::Result)
46
+ end
47
+
48
+ it "calls dispose_code_complete_results on GC" do
49
+ expect(Lib).to receive(:dispose_code_complete_results).at_least(:once)
50
+ expect{results.free}.not_to raise_error
51
+ end
52
+
53
+ it "#each" do
54
+ spy = double(stub: nil)
55
+ expect(spy).to receive(:stub).exactly(results.size).times
56
+ results.each { spy.stub }
57
+ end
58
+
59
+ it "#num_diagnostics" do
60
+ expect(results.num_diagnostics).to eq(2)
61
+ end
62
+
63
+ it "#diagnostic" do
64
+ expect(results.diagnostic(0)).to be_kind_of(Diagnostic)
65
+ end
66
+
67
+ it "#diagnostics" do
68
+ expect(results.diagnostics).to be_kind_of(Array)
69
+ expect(results.diagnostics.first).to be_kind_of(Diagnostic)
70
+ expect(results.diagnostics.size).to eq(results.num_diagnostics)
71
+ end
72
+
73
+ it "#contexts" do
74
+ expect(results.contexts).to be_kind_of(Hash)
75
+ results.contexts.keys.each { |key|
76
+ expect(FFI::Clang::Lib::CompletionContext.symbols).to include(key)
77
+ }
78
+ end
79
+
80
+ it "#container_usr" do
81
+ expect(results.container_usr).to be_kind_of(String)
82
+ expect(results.container_usr).to match(/std.+vector/)
83
+ end
84
+
85
+ it "#container_kind" do
86
+ expect(results.container_kind).to be_kind_of(Symbol)
87
+ expect(results.container_kind).to eq(:cursor_class_decl)
88
+ end
89
+
90
+ it "#incomplete?" do
91
+ expect(results.incomplete?).to be_false
92
+ end
93
+
94
+ it "#objc_selector" do
95
+ #TODO
96
+ end
97
+
98
+ it "#sort!" do
99
+ results.sort!
100
+ # may be sorted with typed_text kind, first result will start with 'a'
101
+ expect(results.results.first.string.chunks.select{|x| x[:kind] == :typed_text}.first[:text]).to eq('assign')
102
+ end
103
+ end
104
+
105
+ describe CodeCompletion::Result do
106
+ let(:result) { results.results.first }
107
+ it "#string" do
108
+ expect(result.string).to be_kind_of(CodeCompletion::String)
109
+ end
110
+
111
+ it "#kind" do
112
+ expect(result.kind).to be_kind_of(Symbol)
113
+ end
114
+ end
115
+
116
+ describe CodeCompletion::String do
117
+ let(:str) { results.sort!; results.results.first.string }
118
+
119
+
120
+ it "#num_chunks" do
121
+ expect(str.num_chunks).to eq(7)
122
+ end
123
+
124
+ it "#chunk_kind" do
125
+ expect(str.chunk_kind(0)).to eq(:result_type)
126
+ expect(str.chunk_kind(1)).to eq(:typed_text)
127
+ end
128
+
129
+
130
+ it "#chunk_text" do
131
+ expect(str.chunk_text(0)).to eq('void')
132
+ expect(str.chunk_text(1)).to eq('assign')
133
+ end
134
+
135
+ it "#chunk_completion" do
136
+ expect(str.chunk_completion(0)).to be_kind_of(CodeCompletion::String)
137
+ end
138
+
139
+ it "#chunks" do
140
+ expect(str.chunks).to be_kind_of(Array)
141
+ expect(str.chunks.first).to be_kind_of(Hash)
142
+ expect(str.chunks.size).to eq(str.num_chunks)
143
+ end
144
+
145
+ it "#priority" do
146
+ expect(str.priority).to be_kind_of(Integer)
147
+ end
148
+
149
+ it "#availability" do
150
+ expect(str.availability).to be_kind_of(Symbol)
151
+ expect(str.availability).to eq(:available)
152
+ end
153
+
154
+ it "#num_annotations" do
155
+ expect(str.num_annotations).to be_kind_of(Integer)
156
+ expect(str.num_annotations).to eq(0)
157
+ end
158
+
159
+ it "#annotation" do
160
+ expect(str.annotation(100)).to be_nil
161
+ # TODO: need tests for String which has annotation
162
+ end
163
+
164
+ it "#annotations" do
165
+ expect(str.annotations).to be_kind_of(Array)
166
+ # TODO: need tests for String which has annotation
167
+ end
168
+
169
+ it "#parent" do
170
+ expect(str.parent).to be_kind_of(String)
171
+ expect(str.parent).to eq('std::vector')
172
+ end
173
+
174
+ it "#comment" do
175
+ expect(str.comment).to be_nil
176
+ # TODO: need tests for String which has real comment
177
+ end
178
+ end
179
+ end