Class: RText::DefaultCompleter

Inherits:
Object
  • Object
show all
Defined in:
lib/rtext/default_completer.rb

Defined Under Namespace

Classes: CompletionOption

Instance Method Summary collapse

Constructor Details

#initialize(language) ⇒ DefaultCompleter

Creates a completer for RText::Language language.



11
12
13
# File 'lib/rtext/default_completer.rb', line 11

def initialize(language)
  @lang = language
end

Instance Method Details

#add_label_options(context, clazz, result) ⇒ Object



95
96
97
98
99
100
101
# File 'lib/rtext/default_completer.rb', line 95

def add_label_options(context, clazz, result)
  result.concat(@lang.labled_arguments(clazz).
    select{|f| 
      !context.element.eIsSet(f.name)}.collect do |f| 
      CompletionOption.new("#{f.name}:", "<#{f.eType.name}>")
    end )
end

#add_value_options(context, result) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/rtext/default_completer.rb', line 73

def add_value_options(context, result)
  if context.feature.is_a?(RGen::ECore::EAttribute) || !context.feature.containment
    if context.feature.is_a?(RGen::ECore::EReference)
      result.concat(reference_options(context))
    elsif context.feature.eType.is_a?(RGen::ECore::EEnum)
      result.concat(enum_options(context))
    elsif context.feature.eType.instanceClass == String
      result.concat(string_options(context))
    elsif context.feature.eType.instanceClass == Integer 
      result.concat(integer_options(context))
    elsif context.feature.eType.instanceClass == Float 
      result.concat(float_options(context))
    elsif context.feature.eType.instanceClass == RGen::MetamodelBuilder::DataTypes::Boolean
      result.concat(boolean_options(context))
    else
      # no options 

    end
  else
    # containment reference, ignore

  end
end

#block_options(context, clazz) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rtext/default_completer.rb', line 42

def block_options(context, clazz)
  types = []
  labled_refs = []
  if context.feature
    if context.feature.is_a?(RGen::ECore::EReference) && context.feature.containment
      types = @lang.concrete_types(context.feature.eType)
    else
      # invalid, ignore

    end
  else
    # all target types which don't need a label

    # and all lables which are needed by a potential target type

    @lang.containments(clazz).each do |r|
      ([r.eType] + r.eType.eAllSubTypes).select{|t| !t.abstract}.each do |t|
        if @lang.labeled_containment?(clazz, r) || @lang.containments_by_target_type(clazz, t).size > 1
          labled_refs << r
        else
          types << t
        end
      end
    end
  end
  types.uniq.
    sort{|a,b| a.name <=> b.name}.collect do |c| 
      class_completion_option(c)
    end +
  labled_refs.uniq.collect do |r|
      CompletionOption.new("#{r.name}:", "<#{r.eType.name}>")
    end
end

#boolean_options(context) ⇒ Object



141
142
143
# File 'lib/rtext/default_completer.rb', line 141

def boolean_options(context)
  [true, false].collect{|b| CompletionOption.new("#{b}", value_description(context)) }
end

#complete(context) ⇒ Object

Provides completion options



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/rtext/default_completer.rb', line 17

def complete(context)
  clazz = context && context.element && context.element.class.ecore
  if clazz
    if context.in_block
      block_options(context, clazz)
    elsif !context.problem
      result = []
      if context.feature
        add_value_options(context, result)
      end
      if !context.after_label
        add_label_options(context, clazz, result)
      end
      result
    else
      # missing comma, after curly brace, etc.

      []
    end
  elsif context
    root_options
  else
    []
  end
end

#enum_options(context) ⇒ Object



114
115
116
117
118
119
120
121
122
123
# File 'lib/rtext/default_completer.rb', line 114

def enum_options(context)
  context.feature.eType.eLiterals.collect do |l|
    lname = l.name
    if lname =~ /^\d|\W/ || lname == "true" || lname == "false"
      lname =  "\"#{lname.gsub("\\","\\\\\\\\").gsub("\"","\\\"").gsub("\n","\\n").
        gsub("\r","\\r").gsub("\t","\\t").gsub("\f","\\f").gsub("\b","\\b")}\""
    end
    CompletionOption.new("#{lname}", "<#{context.feature.eType.name}>")
  end
end

#float_options(context) ⇒ Object



137
138
139
# File 'lib/rtext/default_completer.rb', line 137

def float_options(context)
  (0..0).collect{|i| CompletionOption.new("#{i}.0", value_description(context)) }
end

#integer_options(context) ⇒ Object



133
134
135
# File 'lib/rtext/default_completer.rb', line 133

def integer_options(context)
  (0..0).collect{|i| CompletionOption.new("#{i}", value_description(context)) }
end

#reference_options(context) ⇒ Object



110
111
112
# File 'lib/rtext/default_completer.rb', line 110

def reference_options(context)
  []
end

#root_optionsObject



103
104
105
106
107
108
# File 'lib/rtext/default_completer.rb', line 103

def root_options
  @lang.root_classes.
    sort{|a,b| a.name <=> b.name}.collect do |c| 
      class_completion_option(c)
    end 
end

#string_options(context) ⇒ Object



125
126
127
128
129
130
131
# File 'lib/rtext/default_completer.rb', line 125

def string_options(context)
  if @lang.unquoted?(context.feature)
    [ CompletionOption.new("#{context.feature.name.gsub(/\W/,"")}", value_description(context)) ]
  else
    [ CompletionOption.new("\"\"", value_description(context)) ]
  end
end