starscope 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: []