Top Level Namespace

Defined Under Namespace

Modules: Talk Classes: Array

Instance Method Summary collapse

Instance Method Details

#assist_line(field) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/languages/objc/objc.rb', line 62

def assist_line(field)
  return nil if field[:type].length <= 1
  elements = []
  field[:type].reverse.each do |type|
    elements.push case
      when is_array?(type)
        "array"
      when is_dict?(type)
        "dict"
      when type == "talkobject"
        "TalkObject"
      when is_native?(type)
        "native"
      else
        truncated_name(type)
    end
  end

  stringified = elements.map { |e| "@\"#{e}\"" }
  "@[#{stringified.join(",")}]"
end

#autogenerated_warningObject



9
10
11
12
13
14
# File 'lib/languages/js/js.rb', line 9

def autogenerated_warning
  <<-AUTOGEN_DONE
// Autogenerated from Talk
// Please do not edit this file directly. Instead, modify the underlying .talk files.
  AUTOGEN_DONE
end

#class_field_maps(cls) ⇒ Object



94
95
96
# File 'lib/languages/objc/objc.rb', line 94

def class_field_maps(cls)
  @target[:map].select { |map| map[:class_name] == truncated_name(cls[:name]) }
end

#class_has_bigdec(cls) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/languages/java/java.rb', line 59

def class_has_bigdec(cls)
  cls[:field].each do |f|
    return true if f[:type][0] == "uint64"
  end

  false
end

#class_has_map(cls) ⇒ Object



67
68
69
70
71
72
73
# File 'lib/languages/java/java.rb', line 67

def class_has_map(cls)
  cls[:field].each do |f|
    return true if f[:type].include? "{}"
  end

  false
end

#class_line(cls) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/languages/js/js.rb', line 32

def class_line(cls)
  @rendered ||= Set.new
  out = []

  return nil unless cls[:implement]
  return nil if cls[:name] == rootclass
  return nil if @rendered.include? cls
  @rendered.add(cls)
  out << class_line(class_named(cls[:inherits])) unless cls[:inherits].nil?
  out << comment_block(cls)
  out << "// " + cls[:name]

  fields = {}
  cls[:field].each do |field|
    mapped = mapped_name(cls[:name], field[:name], :field)
    fields[mapped] = {typeStack:field[:type]}
    fields[mapped][:canonicalName] = field[:name] unless mapped == field[:name]
  end

  out << "TalkObject.addClass('#{cls[:name]}', #{fields.to_json}, '#{truncated_name(superclass(cls))}');"
  out.join("\n")
end

#class_named(name, classes) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/languages/language.rb', line 36

def class_named(name, classes)
  name_elements = name.split(".")
  classes.each do |defn|
    defn_elements = defn[:name].split(".")
    return defn if defn_elements.length >= name_elements.length && defn_elements[-name_elements.length .. -1] == name_elements
  end

  nil
end

#class_package(cls) ⇒ Object



42
43
44
# File 'lib/languages/java/java.rb', line 42

def class_package(cls)
  cls[:name].split(".")[0..-2].join(".")
end

#classname_for_filename(name) ⇒ Object

/path/to/file_name.rb to FileName



4
5
6
# File 'lib/languages/language.rb', line 4

def classname_for_filename(name) # /path/to/file_name.rb to FileName
  File.basename(name.to_s, ".rb").split('_').collect { |word| word.capitalize }.join("")
end

#comment_block(tag, indent_level = 0) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/languages/js/js.rb', line 16

def comment_block(tag, indent_level=0)
  lines = []
  indent = "\t" * indent_level
  lines.push(indent + "/*")
  lines.push(wrap_text_to_width(tag[:description], 80, indent + " *  ")) unless tag[:description].nil?
  lines.push(indent + " *  ")
  lines.push(indent + " *  " + definition_reference(tag))
  lines.push(indent + " */")

  lines.join("\n")
end

#comment_line(tag) ⇒ Object



42
43
44
# File 'lib/languages/objc/objc.rb', line 42

def comment_line(tag)
  tag[:description].nil? ? "" : "//!< #{tag[:description]}"
end

#constant_definition(constant) ⇒ Object



38
39
40
# File 'lib/languages/objc/objc.rb', line 38

def constant_definition(constant)
  "#{constant[:name]} = #{constant[:value].to_i}, #{comment_line(constant)}"
end

#convert_field_for_map(field) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/languages/java/java.rb', line 113

def convert_field_for_map(field)
  case field
  when "byte"
    "Byte"
  when "short"
    "Short"
  when "int"
    "Integer"
  when "long"
    "Long"
  when "double"
    "Double"
  else
    field
  end
end

#definition_reference(tag) ⇒ Object



28
29
30
# File 'lib/languages/js/js.rb', line 28

def definition_reference(tag)
  "@talkFile #{tag[:__meta][:file]}:#{tag[:__meta][:line]}"
end

#detail_comment_block(cls) ⇒ Object



91
92
93
94
95
96
97
# File 'lib/languages/java/java.rb', line 91

def detail_comment_block(cls)
  lines = []
  lines.push("\t/**")
  lines.push("\t *  #{truncated_name cls[:name]}")
  cls[:field].each { |f| lines.push("\t *  @param #{field_datatype f} #{f[:name]}") }
  lines.join("\n")
end

#dissect_type(type) ⇒ Object



1
2
3
4
5
6
7
8
9
10
# File 'lib/contexts/field.rb', line 1

def dissect_type(type)
	containers = []
	while is_container?(type)
		containers.push type[-2..-1] # last two characters
		type = type[0..-3] # all but last two
	end

	containers.push type
	containers.reverse
end

#dynamic_body_for_named_wrapperObject



103
104
105
106
# File 'lib/languages/objc/objc.rb', line 103

def dynamic_body_for_named_wrapper
  return "@dynamic body;" if truncated_name(@current_class[:name]) == 'NamedObjectWrapper'
  ""
end

#enumeration_line(enumeration) ⇒ Object



73
74
75
76
77
78
79
80
81
# File 'lib/languages/js/js.rb', line 73

def enumeration_line(enumeration)
  constants = {}
  enumeration[:constant].each { |constant| constants[constant[:name]] = constant[:value] }

  out = []
  out << comment_block(enumeration)
  out << "TalkObject.addEnumeration('#{enumeration[:name]}', #{constants.to_json});"
  out.join("\n")
end

#field_accessors(field) ⇒ Object



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/languages/java/java.rb', line 184

def field_accessors(field)
  lines = []
  lines.push "\t/**"
  lines.push "\t#{wrap_text_to_width(field[:description])}"
  lines.push "\t#{field[:deprecated] if field.has_key? :deprecated}"
  lines.push "\t#{definition_reference(field)}"
  lines.push "\t@param #{field[:name]} #{field[:description]}"
  lines.push "\t*/"
  lines.push "\tpublic void #{setter_name(field)}(#{field_datatype(field)} #{field[:name]}) {"
  lines.push "\t\tthis.#{field[:name]} = #{field[:name]};"
  lines.push "\t}"
  lines.push "\t/**"
  lines.push "\t#{wrap_text_to_width(field[:description])}"
  lines.push "\t#{field[:deprecated] if field.has_key? :deprecated}"
  lines.push "\t#{definition_reference(field)}"
  lines.push "\t@return #{field[:name]} #{field[:description]}"
  lines.push "\t*/"
  lines.push "\tpublic #{field_datatype(field)} #{getter_name(field)}() {"
  lines.push "\t\treturn this.#{field[:name]};"
  lines.push "\t}"
  lines.join "\n"
end

#field_datatype(field) ⇒ Object



165
166
167
# File 'lib/languages/java/java.rb', line 165

def field_datatype(field)
  field_datatype_rec(field, field[:type])
end

#field_datatype_basic(field, type) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/languages/java/java.rb', line 130

def field_datatype_basic(field, type)
  if is_primitive? type then
    case type
    when "string"
      "String"
    when "real"
      "double"
    when "bool"
      "boolean"
    when "object"
      "Object"
    when "talkobject"
      rootclass
    when "int8"
      "byte"
    when "uint8"
      "short"
    when "int16"
      "short"
    when "uint16"
      "int"
    when "int32"
      "int"
    when "uint32"
      "long"
    when "int64"
      "long"
    when "uint64"
      "BigDecimal"
    end
  else
    truncated_name type
  end
end

#field_datatype_rec(field, stack) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/languages/java/java.rb', line 99

def field_datatype_rec(field, stack)
  return field_datatype_basic(field, stack.last) if stack.length == 1
  t = stack.last

  r = field_datatype_rec(field, stack[0 .. -2])
  if is_array? t then
    "#{r}[]"
  elsif is_dict? t then
    "Map<String, #{convert_field_for_map(r)}>"
  else
    nil
  end
end

#field_definition(cls, field) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/languages/objc/objc.rb', line 123

def field_definition(cls, field)
  base_type = field[:type].last
  objc_type = case
    when is_array?(base_type)
      "NSMutableArray *"
    when is_dict?(base_type)
      "NSMutableDictionary *"
    when (base_type == "talkobject" or base_type == "object")
      "TalkObject *"
    when base_type.match(/(u)?int(8|16|32|64)/)
      primitive_type(not($1.nil?), $2)
    when base_type == "real"
      "double"
    when base_type == "bool"
      "BOOL"
    when base_type == "string"
      "NSString *"
    else
      truncated_name(base_type) + " *"
  end
  "#{objc_type} #{mapped_name(cls, field, :field)}"
end

#field_tags(field) ⇒ Object



114
115
116
117
118
119
120
121
# File 'lib/languages/objc/objc.rb', line 114

def field_tags(field)
  case field[:type].last
  when "real", "bool", "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64"
    "(readwrite,assign)"
  else
    "(readwrite,nonatomic,retain)"
  end
end

#field_variable(field) ⇒ Object



169
170
171
172
173
174
# File 'lib/languages/java/java.rb', line 169

def field_variable(field)
  lines = []
  lines.push comment_block(field, 1)
  lines.push "\tprotected #{field_datatype(field)} #{field[:name]};"
  lines.join("\n")
end

#filename_for_class(cls) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/languages/objc/objc.rb', line 14

def filename_for_class(cls)
  class_dir = "classes"
  if meta(:namespace) == "true" then
    namespace = cls[:name][@prefix.length..-1].split(".")[0..-2]
    return File.join(class_dir, truncated_name(cls)) if namespace.empty?

    namespace = namespace[1..-1] while namespace[0].length == 0
    File.join(class_dir, namespace.join("/"), truncated_name(cls))
  else
    File.join(class_dir, truncated_name(cls))
  end
end

#filename_for_entity(name) ⇒ Object



18
19
20
21
# File 'lib/languages/java/java.rb', line 18

def filename_for_entity(name)
  name = name[:name] if name.is_a? Hash
  name.gsub(".", "/") + ".java"
end

#getter_name(field) ⇒ Object



180
181
182
# File 'lib/languages/java/java.rb', line 180

def getter_name(field)
  "get#{field[:name].sub(/^(\w)/) {|s| s.capitalize}}"
end

#glossary_line(glossary) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/languages/js/js.rb', line 63

def glossary_line(glossary)
  terms = {}
  glossary[:term].each { |term| terms[term[:name]] = term[:value] }

  out = []
  out << comment_block(glossary)
  out << "TalkObject.addGlossary('#{glossary[:name]}', #{terms.to_json});"
  out.join("\n")
end

#glossary_term_name(name) ⇒ Object



34
35
36
# File 'lib/languages/objc/objc.rb', line 34

def glossary_term_name(name)
  "k"+name
end

#import_classesObject



75
76
77
# File 'lib/languages/java/java.rb', line 75

def import_classes
  (list_references_for_class(@current).map { |name| "import #{name};"}).join("\n")
end

#is_array?(type) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/languages/language.rb', line 28

def is_array?(type)
  type == "[]"
end

#is_container?(type) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/contexts/field.rb', line 20

def is_container?(type)
	type.end_with? "[]" or type.end_with? "{}"
end

#is_dict?(type) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/languages/language.rb', line 32

def is_dict?(type)
  type == "{}"
end

#is_native?(type) ⇒ Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/languages/language.rb', line 24

def is_native?(type)
  type != "talkobject" and is_primitive?(type)
end

#is_primitive?(type) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
15
16
17
18
# File 'lib/contexts/field.rb', line 12

def is_primitive?(type)
	primitives = [
		"uint8", "uint16", "uint32", "uint64",
		"int8", "int16", "int32", "int64",
		"string", "real", "bool", "object", "talkobject" ]
	primitives.include? type
end

#list_references_for_class(cls) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/languages/java/java.rb', line 46

def list_references_for_class(cls)
  references = Set.new
  cls[:field].each do |field|
    unless is_primitive?(field[:type].first) then
      references.add(class_named(field[:type][0], @base[:class])[:name])
    end
  end

  references.add("java.math.BigDecimal") if class_has_bigdec(cls)
  references.add("java.util.Map") if class_has_map(cls)
  references.to_a
end

#make_sourceObject



3
4
5
6
7
# File 'lib/languages/js/js.rb', line 3

def make_source
  @prefix = common_class_prefix if meta(:namespace) == "true"
  transform = meta(:minify) ? lambda { |source| Uglifier.compile(source)} : nil
  generate_template(meta(:file) || "talk.js", "talk.js.erb", transform)
end

#primitive_type(unsigned, size) ⇒ Object



108
109
110
111
112
# File 'lib/languages/objc/objc.rb', line 108

def primitive_type(unsigned, size)
  type = "int#{size}_t"
  type = "u" + type if unsigned
  type
end

#protocol_constant_name(name) ⇒ Object



84
85
86
87
# File 'lib/languages/objc/objc.rb', line 84

def protocol_constant_name(name)
  name = (name.split("/").map { |x| x[0].upcase + x[1..-1] }).join("")
  "kProto#{name}"
end

#protocol_line(proto) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/languages/js/js.rb', line 55

def protocol_line(proto)
  methods = proto[:method].map { |m| m[:name] }
  out = []
  out << comment_block(proto)
  out << "TalkObject.addProtocol('#{proto[:name]}', #{methods.to_json});"
  out.join("\n")
end

#protocol_method_name(p_name, m_name) ⇒ Object



89
90
91
92
# File 'lib/languages/objc/objc.rb', line 89

def protocol_method_name(p_name, m_name)
  m_name = m_name[0].upcase + m_name[1..-1]
  "#{protocol_constant_name(p_name)}Method#{m_name}"
end

#rootclassObject



16
17
18
# File 'lib/languages/language.rb', line 16

def rootclass
  @target[:rootclass] || "TalkObject"
end

#safe_escape(str) ⇒ Object



146
147
148
# File 'lib/languages/objc/objc.rb', line 146

def safe_escape(str)
  str.gsub("\\", "\\\\\\").gsub("\"", "\\\"")
end

#setter_name(field) ⇒ Object



176
177
178
# File 'lib/languages/java/java.rb', line 176

def setter_name(field)
  "set#{field[:name].sub(/^(\w)/) {|s| s.capitalize}}"
end

#superclass(cls) ⇒ Object



20
21
22
# File 'lib/languages/language.rb', line 20

def superclass(cls)
  cls[:inherits] || rootclass
end

#talk_definitionObject



150
151
152
# File 'lib/languages/objc/objc.rb', line 150

def talk_definition
  @base
end

#to_valObject



3
4
5
# File 'lib/contexts/string.rb', line 3

def to_val
	self[:value]
end

#trimmed_fields(cls) ⇒ Object



98
99
100
101
# File 'lib/languages/objc/objc.rb', line 98

def trimmed_fields(cls)
  return cls[:field] unless truncated_name(cls[:name]) == 'NamedObjectWrapper'
  cls[:field].reject { |f| f[:name] == "body" }
end