starscope 0.1.0 → 0.1.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.
data/CHANGELOG.md CHANGED
@@ -1,7 +1,13 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- v0.1.0 (trunk)
4
+ v0.1.1 (trunk)
5
+ -------------------
6
+
7
+ New Features:
8
+ * Support for Google's go (AKA golang).
9
+
10
+ v0.1.0 (2013-08-08)
5
11
  -------------------
6
12
 
7
13
  New Features:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- starscope (0.1.0)
4
+ starscope (0.1.1)
5
5
  oj (~> 2.1)
6
6
  parser (= 2.0.0.pre6)
7
7
  ruby-progressbar (~> 1.1)
data/README.md CHANGED
@@ -10,9 +10,9 @@ Anyone who has done much programming in C (or C++) on a unix-based OS has come
10
10
  across the fantastic Cscope tool [1]. Sadly, it only works for C (and sort of
11
11
  works for C++).
12
12
 
13
- StarScope is a similar tool for Ruby, with a design intended to make it easy to
14
- add support for other languages at some point within the same framework (thus
15
- the name StarScope, ie \*scope).
13
+ StarScope is a similar tool for Ruby and Go, with a design intended to make it
14
+ easy to add support for other languages at some point within the same framework
15
+ (thus the name StarScope, ie \*scope).
16
16
 
17
17
  Install it as a gem:
18
18
  ```
@@ -8,13 +8,19 @@ class StarScope::Datum
8
8
  end
9
9
 
10
10
  if args[:scope]
11
- args[:scope] = args[:scope].map {|x| x.to_sym}
11
+ if args[:scope].empty?
12
+ args.delete(:scope)
13
+ else
14
+ args[:scope] = args[:scope].map {|x| x.to_sym}
15
+ end
12
16
  end
13
17
 
14
18
  args
15
19
  end
16
20
 
17
21
  def self.score_match(dat, fqn)
22
+ return 0 if not dat[:scope]
23
+
18
24
  score = 0
19
25
 
20
26
  i = -1
@@ -36,7 +42,7 @@ class StarScope::Datum
36
42
 
37
43
  def self.to_s(key, dat)
38
44
  str = ""
39
- str << "#{dat[:scope].join " "} " unless dat[:scope].empty?
45
+ str << "#{dat[:scope].join " "} " if dat[:scope]
40
46
  str << "#{key} -- #{location dat}"
41
47
  str << " (#{dat[:line].strip})"
42
48
  end
data/lib/starscope/db.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'starscope/langs/go'
1
2
  require 'starscope/langs/ruby'
2
3
  require 'starscope/datum'
3
4
  require 'date'
@@ -5,7 +6,10 @@ require 'oj'
5
6
  require 'zlib'
6
7
  require 'ruby-progressbar'
7
8
 
8
- LANGS = [StarScope::Lang::Ruby]
9
+ LANGS = [
10
+ StarScope::Lang::Go,
11
+ StarScope::Lang::Ruby
12
+ ]
9
13
 
10
14
  class StarScope::DB
11
15
 
@@ -0,0 +1,161 @@
1
+ module StarScope::Lang
2
+ module Go
3
+ FUNC_CALL = /([\w\.]+?)\(.*\)/
4
+ BUILTIN_FUNCS = ['new', 'make', 'len', 'close', 'copy', 'delete',
5
+ 'int', 'int8', 'int16', 'int32', 'int64',
6
+ 'uint', 'uint8', 'uint16', 'uint32', 'uint64',
7
+ 'string', 'byte']
8
+
9
+ def self.match_file(name)
10
+ name =~ /.*\.go$/
11
+ end
12
+
13
+ def self.extract(file)
14
+ stack = []
15
+ scope = []
16
+ str = File.readlines(file).each_with_index do |line, line_no|
17
+ # strip single-line comments like // foo
18
+ match = /(.*)\/\//.match(line)
19
+ if match
20
+ line = match[1]
21
+ end
22
+ # strip single-line comments like foo /* foo */ foo
23
+ match = /(.*?)\/\*.*\*\/(.*)/.match(line)
24
+ if match
25
+ line = match[1] + match[2]
26
+ end
27
+ # strip end-of-line comment starters like foo /* foo \n
28
+ match = /(.*?)\/\*/.match(line)
29
+ if match
30
+ line = match[1]
31
+ ends_with_comment = true
32
+ else
33
+ ends_with_comment = false
34
+ end
35
+ # if we're in a block comment, wait for it to end
36
+ if stack[-1] == :comment
37
+ match = /\*\/(.*)/.match(line)
38
+ if match
39
+ line = match[1]
40
+ stack.pop
41
+ else
42
+ next
43
+ end
44
+ end
45
+ # poor-man's parser
46
+ case stack[-1]
47
+ when :struct
48
+ case line
49
+ when /\s*(\w+)\s+\w+/
50
+ yield :defs, $1, line_no: line_no+1, scope: scope
51
+ when /}/
52
+ stack.pop
53
+ scope.pop
54
+ end
55
+ when :interface
56
+ case line
57
+ when /\s*(\w+)\(.*\)\s+/
58
+ yield :defs, $1, line_no: line_no+1, scope: scope
59
+ when /}/
60
+ stack.pop
61
+ scope.pop
62
+ end
63
+ when :def
64
+ case line
65
+ when /\s*(\w+)\s+/
66
+ yield :defs, $1, line_no: line_no+1, scope: scope
67
+ when /\)/
68
+ stack.pop
69
+ end
70
+ when :import
71
+ case line
72
+ when /"(.+)"/
73
+ name = $1.split('/')
74
+ yield :imports, name[-1], line_no: line_no+1, scope: name[0...-1]
75
+ when /\)/
76
+ stack.pop
77
+ end
78
+ else
79
+ if stack[-1] == :func and /^}/ =~ line
80
+ stack.pop
81
+ end
82
+ case line
83
+ when /^func\s+(\w+)\(/
84
+ yield :defs, $1, line_no: line_no+1, scope: scope
85
+ stack.push(:func)
86
+ when /^func\s+\(\w+\s+\*?(\w+)\)\s*(\w+)\(/
87
+ yield :defs, $2, line_no: line_no+1, scope: scope + [$1]
88
+ stack.push(:func)
89
+ when /^package\s+(\w+)/
90
+ yield :defs, $1, line_no: line_no+1, scope: scope
91
+ scope.push($1)
92
+ when /^type\s+(\w+)\s+struct\s*{/
93
+ yield :defs, $1, line_no: line_no+1, scope: scope
94
+ scope.push($1)
95
+ stack.push(:struct)
96
+ when /^type\s+(\w+)\s+interface\s*{/
97
+ yield :defs, $1, line_no: line_no+1, scope: scope
98
+ scope.push($1)
99
+ stack.push(:interface)
100
+ when /^type\s+(\w+)/
101
+ yield :defs, $1, line_no: line_no+1, scope: scope
102
+ when /^import\s+"(.+)"/
103
+ name = $1.split('/')
104
+ yield :imports, name[-1], line_no: line_no+1, scope: name[0...-1]
105
+ when /^import\s+\(/
106
+ stack.push(:import)
107
+ when /^var\s+\(/
108
+ stack.push(:def)
109
+ when /^var\s+(\w+)\s+\w+/
110
+ yield :defs, $1, line_no: line_no+1, scope: scope
111
+ when /^const\s+\(/
112
+ stack.push(:def)
113
+ when /^const\s+(\w+)\s+\w+/
114
+ yield :defs, $1, line_no: line_no+1, scope: scope
115
+ when /^\s+(.*?) :?= ((.*?)\(.*\))?/
116
+ $1.split(',').each do |var|
117
+ var = var.strip
118
+ name = var.split('.')
119
+ case name.length
120
+ when 1
121
+ yield :assigns, name[0], line_no: line_no+1, scope: scope
122
+ when 2
123
+ yield :assigns, name[1], line_no: line_no+1, scope: [name[0]]
124
+ end
125
+ end
126
+ if $2
127
+ match = FUNC_CALL.match($2)
128
+ if match
129
+ tmp = parse_call(match[1], line_no, scope)
130
+ yield tmp if tmp
131
+ end
132
+ end
133
+ when FUNC_CALL
134
+ tmp = parse_call($1, line_no, scope)
135
+ yield tmp if tmp
136
+ end
137
+ end
138
+ # if the line looks like "foo /* foo" then we enter the comment state
139
+ # after parsing the usable part of the line
140
+ if ends_with_comment
141
+ stack.push(:comment)
142
+ end
143
+ end
144
+ end
145
+
146
+ def self.parse_call(line, line_no, scope)
147
+ name = line.split('.').select {|chunk| not chunk.empty?}
148
+ case name.length
149
+ when 1
150
+ return nil if name[0] == 'func'
151
+ if BUILTIN_FUNCS.include?(name[0])
152
+ return :calls, name[0], line_no: line_no+1
153
+ else
154
+ return :calls, name[0], line_no: line_no+1, scope: scope
155
+ end
156
+ else
157
+ return :calls, name[-1], line_no: line_no+1, scope: name[0...-1]
158
+ end
159
+ end
160
+ end
161
+ end
@@ -1,3 +1,3 @@
1
1
  module StarScope
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: starscope
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Evan Huus
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-08 00:00:00.000000000 Z
12
+ date: 2013-08-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  prerelease: false
@@ -142,6 +142,7 @@ files:
142
142
  - lib/starscope.rb
143
143
  - lib/starscope/datum.rb
144
144
  - lib/starscope/db.rb
145
+ - lib/starscope/langs/go.rb
145
146
  - lib/starscope/langs/ruby.rb
146
147
  - lib/starscope/value.rb
147
148
  - lib/starscope/version.rb
@@ -159,7 +160,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
160
  - !ruby/object:Gem::Version
160
161
  segments:
161
162
  - 0
162
- hash: -4533453239802094474
163
+ hash: -2462571532840130105
163
164
  version: '0'
164
165
  none: false
165
166
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -168,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
169
  - !ruby/object:Gem::Version
169
170
  segments:
170
171
  - 0
171
- hash: -4533453239802094474
172
+ hash: -2462571532840130105
172
173
  version: '0'
173
174
  none: false
174
175
  requirements: []