SWEP "self" Inheritance Not Working

Please nobody fix this for me, please explain it. I want to understand what’s wrong, not have someone code it for me.

function SWEP:BaseAttack()

	burstfire = burstfire + 1  

   if not self:CanPrimaryAttack() then return end

   if CLIENT then
      self.Weapon:EmitSound( self.Primary.Sound, self.Primary.SoundLevel )
   elseif SERVER then
      sound.Play(self.Primary.Sound, self:GetPos(), self.Primary.SoundLevel)

   self:ShootBullet( self.Primary.Damage, self.Primary.Recoil, self.Primary.NumShots, self:GetPrimaryCone() )

   self:TakePrimaryAmmo( 1 )

   local owner = self.Owner
   if not IsValid(owner) or owner:IsNPC() or (not owner.ViewPunch) then return end

   owner:ViewPunch( Angle( math.Rand(-0.2,-0.1) * self.Primary.Recoil, math.Rand(-0.1,0.1) *self.Primary.Recoil, 0 ) )


[ERROR] gamemodes/terrortown/entities/weapons/weapon_ttt_m16/shared.lua:57: attempt to index local 'self' (a nil value)
  1. unknown - gamemodes/terrortown/entities/weapons/weapon_ttt_m16/shared.lua:57

I interpret this to mean “self” is not pointing to the SWEP like it’s supposed to, but the exact same syntax works in neighboring functions. Is there a reason self isn’t working?

Which line is 57?