Hi Tony.
Of course this was a trivial example.
I was grepping the output of jar -> content-texfile to find the packages
of a java-class.
Currently I'm using this function.
I'm invoking this function for up to 40 files or more.. That depends on
how many modules I have imported.
  let type_pattern = 
'\zs\('.func_name.'\)\%(\s*,\s*\%('.func_name.'\)\)*\ze\s*::'
    if line =~ type_pattern
This is no longer that simple.
But I can do a deepcopy and use filter.. But then I'll no longer able to get
the line numbers.. 
My question was meant to be more general as my example given in the last
post.

Greetings Marc

function! vl#dev#haskell#modules_list_cache_jump#ScanModuleForFunctions(file)
  " a function is recognized as function if the looks like 
  " a b c = ...
  " and a is no keyword (data, new\=type, instance)
  let func_name = '\w\+'
  let no_f_pattern = '\%(\%(\%(new\)\=type\)\|data\)'
  " pattern1 / 2 matches
  " 1) function_name arg1 arg2 =
  " 2) arg1 `function_name` arg2 =
  let f_pattern1 = '\zs'.func_name.'\ze\%(\s\+\w\+\)*\s*='
  let f_pattern2 = '\w\+\s*`\zs\w\+\ze`\s*\w\+\s*='
  let f_pattern = '^\s*\%(\%('.f_pattern1.'\)\|\%('.f_pattern2.'\)\)'

  let result = {}
  for line_nr in range(0,len(a:file)-1)
    let line = a:file[line_nr]
    if line =~ no_f_pattern
      continue
    endif
    if line =~ f_pattern
      let result[matchstr(line, f_pattern1)]={"impl": line_nr}
    endif
  endfor
  
  " add type declarations.. doesn't recognize lists (a, b :: ) yet.
  " Is needed to get the function names eg of
  " newtype Cont r a = Cont { runCont :: (a -> r) -> r }
  let type_pattern = 
'\zs\('.func_name.'\)\%(\s*,\s*\%('.func_name.'\)\)*\ze\s*::'
  let g:tp = type_pattern
  for line_nr in range(0,len(a:file)-1)
    let line = a:file[line_nr]
    if line =~ type_pattern
      let list = split(matchstr(line, type_pattern),'\s*,\s*')
      for func_name in list
        if exists("result['".func_name."']")
          let result[func_name]['type'] = line_nr
        else
          let result[func_name]={"type": line_nr}
        endif
      endfor
    endif
  endfor
  return result
endfunction

Reply via email to