Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

class method name generation error #30

Open
tek opened this issue Jan 26, 2014 · 6 comments
Open

class method name generation error #30

tek opened this issue Jan 26, 2014 · 6 comments

Comments

@tek
Copy link

tek commented Jan 26, 2014

I upgraded from 0.2.9 today and it broke class generation. when trying to instantiate a class, I get the error

E117: Unknown function: s:SID
E116: Invalid arguments for function function('<SNR>' . s:SID() . '_s:MyClass_method_name')
E15: Invalid expression: function('<SNR>' . s:SID() . '_s:MyClass_method_name')

I put a debug output statement into ast_rewriter.rb and a SID node is excluded in the rewritten syntax tree, though it's not present in the generated viml file.

If I just paste it on top of the riml file (in VimL), everything's fine.

Also, the generated methods look like

function! <SID>s:MyClass_method_name()

Isn't the s: superfluous?

@luke-gru
Copy link
Owner

Hi @tek,

Thanks for the detailed report. The s: is superfluous, but to my knowledge it does no harm. I'm not sure if that's what the problem is here or not.

Can you paste a small standalone example that will reproduce this error so I can have a better idea of what's going on?

Thanks,

@tek
Copy link
Author

tek commented Jan 27, 2014

@luke-gru

class MyClass
  defm foo
  end
end

foo = new MyClass()

Then doing runtime autoload/foo.vim would be enough.
The output file:

function! s:MyClassConstructor()
  let myClassObj = {}
  let myClassObj.foo = function('<SNR>' . s:SID() . '_s:MyClass_foo')
  return myClassObj
endfunction

function! <SID>s:MyClass_foo() dict
endfunction

let s:foo = s:MyClassConstructor()

s:SID() obviously can't be there, do I miss an import or something?

btw, I wrote 'excluded' in the first post when I meant 'included'.

@luke-gru
Copy link
Owner

Ah I see, thanks. Are you compiling from the commandline, or running riml interactively (riml -i)?

I get the following output when saving your example in a file foo.riml and running riml -c foo.riml

function! s:SID()
  if exists('s:SID_VALUE')
    return s:SID_VALUE
  endif
  let s:SID_VALUE = matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')
  return s:SID_VALUE
endfunction

function! s:MyClassConstructor()
  let myClassObj = {}
  let myClassObj.foo = function('<SNR>' . s:SID() . '_s:MyClass_foo')
  return myClassObj
endfunction

function! <SID>s:MyClass_foo() dict
endfunction

let s:foo = s:MyClassConstructor()

When running riml interactively, the generated s:SID function is left off, but maybe that is confusing behaviour.

@tek
Copy link
Author

tek commented Jan 28, 2014

ah, alright. I am using guard-shell with a Guardfile I created some months ago, that was using riml -s < #{infile} > ${outfile}…I guess SID() is being omitted in stdin mode, too. using -c, I get the correct results.

@tek tek closed this as completed Jan 28, 2014
@tek
Copy link
Author

tek commented Apr 29, 2014

After updating vim today, the <sid>s: seems to be illegal now.

@tek tek reopened this Apr 29, 2014
@tek
Copy link
Author

tek commented Apr 29, 2014

FWIW, this is working at first glance: https://github.com/tek/riml/commit/9d2131f1ceb1ca5e4a6cfc14d4d56bbdeea4c3dd

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants