Class: EleetScript::ClassNode

Inherits:
Object
  • Object
show all
Defined in:
lib/lang/nodes.rb,
lib/lang/interpreter.rb

Instance Method Summary collapse

Instance Method Details

#details_from_class_name(context) ⇒ Object



269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/lang/interpreter.rb', line 269

def details_from_class_name(context)
  if name.kind_of?(String)
    return name, context.namespace_context, context.local_constant(name)
  else
    ns = if name.namespace.nil?
      context.root_ns
    else
      context.namespace(name.namespace)
    end
    exp = name.expression
    while exp.kind_of?(NamespaceAccessNode)
      ns = ns.namespace(exp.namespace)
      exp = exp.expression
    end
    if !exp.kind_of?(GetConstantNode)
      Helpers.throw_eleet_error("Invalid class name given.", context)
      return nil, nil, nil
    end
    return exp.name, ns, ns.local_constant(exp.name)
  end
end

#eval(context) ⇒ Object



246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/lang/interpreter.rb', line 246

def eval(context)
  cls_name, ns_context, cls = details_from_class_name(context)
  return context.es_nil if cls_name.nil? && ns_context.nil? && cls.nil?
  if cls == context.es_nil
    cls = if parent
      parent_cls = if parent.kind_of?(String)
        context[parent]
      else
        parent.eval(context)
      end
      # TODO: Add to_source for all nodes
      Helpers.throw_eleet_error("Attempt to extend undefined class.", context) if parent_cls == context.es_nil
      EleetScriptClass.create(context, cls_name, parent_cls)
    else
      EleetScriptClass.create(context, cls_name)
    end
    ns_context[cls_name] = cls
  end

  body.eval(cls.context)
  cls
end

#to_s(level = 0) ⇒ Object



187
188
189
190
191
192
193
194
# File 'lib/lang/nodes.rb', line 187

def to_s(level = 0)
  tabs = spaces(level)
  str = "#{tabs}<EleetScript::ClassNode \"#{name}\"\n"
  str += "#{tabs}  @extends=\"#{parent || "Object"}\"\n"
  str += "#{tabs}  @body=(\n"
  str += body.to_s(level + 2)
  str + "#{tabs}  )\n#{tabs}>\n"
end